Question

J'utilise le code Unity MVC3 à http://unitymvc3.codeplex.com/ pour avoirune session NHibernate par instance de requête de mon IUnitOfWork.

Cela fonctionnait il y a quelques semaines, j'ai apporté quelques modifications, et maintenant mon IUnitOfWork semble avoir une durée de vie statique.

De mon global.asax.cs:

private static IUnitOfWorkFactory _UoWFactory = new UnitOfWorkFactory(Enums.Databases.MyDBName)
                                                            .AddMapping<DepartmentMap>()
                                                            .CompleteConfiguration();

/// <summary>
/// Configure Unity Application Block
/// </summary>
private void ConfigureUnity()
{
    CIUnity.UnityContainer.Container = new UnityContainer()
        .RegisterType(typeof(IRepository<>), typeof(Repository<>))
        .RegisterType<IUnitOfWork, UnitOfWork>(Enums.Databases.MyDBName.ToString(), new HierarchicalLifetimeManager(), new InjectionConstructor(Enums.Databases.MyDBName))
        .RegisterInstance<IUnitOfWorkFactory>(Enums.Databases.MyDBName.ToString(), _UoWFactory);

    DependencyResolver.SetResolver(new UnityDependencyResolver(CIUnity.UnityContainer.Container));
}

ConfigureUnity() est appelé depuis mon Application_Start()

Voici le code de test de mon constructeur HomeController:

private IUnitOfWork uow;
private IUnitOfWork uow2;

public HomeController()
{
    uow = CIUnity.Container.Resolve<IUnitOfWork>(Enums.Databases.MyDBName.ToString());
    IRepository<Employee> repo = uow.GetRepository<Employee>();

    uow2 = CIUnity.Container.Resolve<IUnitOfWork>(Enums.Databases.MyDBName.ToString());
    IRepository<Department> deptrepo = uow2.GetRepository<Department>();

    var q = from a in repo.Find()
            select a;

    var d = from b in deptrepo.Find()
            select b;
}

... l'IUnitOfWork est résolu sur la même instance, cependant, lors des requêtes de page suivantes, un nouvel IUnitOfWork n'est pas créé ... mais le code fonctionne, donc il enregistre / tire l'objet d'une manière ou d'une autre afin qu'il agisse de manière statique.

Était-ce utile?

La solution

Je me débarrasserais complètement de IUnitOfWorkFactory et injecterais simplement IUnityOfWork dans votre contrôleur - à condition que vous ne vouliez jamais qu'une unité de travail par requête, ce qui semble logique.Vous utilisez alors davantage la puissance du conteneur IoC et pas seulement comme localisateur de services.

Modifiez simplement votre constructeur HomeController en:

public HomeController(IUnitOfWork unitOfWork)
{
  IRepository<Employee> repo = unitOfWork.GetRepository<Employee>();

  IRepository<Department> deptrepo = unitOfWork.GetRepository<Department>();

  ...
}

Et si vous ne l'avez pas déjà fait, ajoutez:

CIUnity.Container.RegisterControllers();

avant d'appeler DependencyResolver.SetResolver

Lorsque le noyau MVC essaie d'instancier votre contrôleur, il utilisera le résolveur Unity.MVC3 qui satisfera automatiquement toutes les dépendances qui dans ce cas signifient unitOfWork.

Le résolveur Unity.MVC3 se chargera également automatiquement de supprimer votre unité de travail à la fin de la requête.

Autres conseils

Il semble que vous souhaitiez que UnitOfWorkFactory renvoie vos dépendances IUnitOfWork?Il semble que vous devriez utiliser .RegisterFactory pour y parvenir.Vous pouvez enregistrer la fabrique avec un ContainerControlledLifetimeManager, et elle se comportera comme un "singleton" sans recourir à un membre statique.

La gestion de la durée de vie peut devenir un peu délicate avec WCF (et probablement Web).J'utilise le code de cet article depuis un certain temps.Il mappe parfaitement la durée de vie Unity à la durée de vie de la demande WCF ... Cela peut vous donner quelques idées sur la meilleure façon d'atteindre votre objectif.

http://drewdotnet.blogspot.com/2009/07 / unity-life-managers-et-wcf.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top