Question

J'ai une configuration de modèle de référentiel à l'aide NHibernate. La classe de base ressemble à ceci:

public interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

// generic NHibernate implementation of IUnitOfWork here

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    private NHibernateUnitOfWork _unitOfWork;

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
    public T Get(object id)
    {
        return _unitOfWork.Session.Get<T>(id);
    }

    // ...
}

Comme vous pouvez le voir, je suis permettant à l'unité de travail à être renseigné par le constructeur (en utilisant StructureMap). Je peuplant les objets du référentiel sur mes services Web ASP.NET comme ceci:

[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
    public IUserAccountRepository UserAccountRepo { get; set; }

    public ModuleService()
    {
        // tell IoC to inject properties
        ObjectFactory.BuildUp(this);
    }

    // ...
}

Comme vous pouvez être en mesure de déduire, mon problème est que par la conception, je l'ai maintenant perdu le contrôle du cycle de vie de l'unité de travail. Auparavant, je faisais l'unité de travail un objet sensible au contexte et le dépôt obtiendrais une référence à elle par quelque chose comme:

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    public T Get(object id)
    {
        return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
    }

    // ...
}

Cette conception précédente m'a permis de contrôler le cycle de vie de l'unité de travail dans mon code en créant l'unité de travail d'un UnitOfWorkFactory dans une déclaration à l'aide. Je tentais de mettre plus de travail dans les mains du conteneur IoC, mais je pense que j'ai pris un pas en arrière. Quelles sont vos réflexions sur la mise en œuvre soit?

Était-ce utile?

La solution

Il est généralement une bonne chose de laisser votre conteneur IoC gérer autant que possible. Sur le web une unité de modèle de travail initialisées généralement au début de la demande et engagée à la fin (annulée s'il y a des exceptions). De cette façon, votre dépôt prendra ISession dans le constructeur au lieu du UnitOfWork. De cette façon, votre dépôt ne sera pas à faire face à commettre ou quoi que ce soit et qui seront traitées automatiquement pour vous.

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