Frage

Ich habe ein Repository-Muster-Setup mit NHibernate. Die Basisklasse sieht wie folgt aus:

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);
    }

    // ...
}

Wie Sie sehen, ich bin die Arbeitseinheit ermöglicht über den Konstruktor gefüllt werden (unter Verwendung von StructureMap). Ich bin die Repository-Objekte auf meinem ASP.NET Web-Service bevölkere etwa so:

[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);
    }

    // ...
}

Wie Sie in der Lage sein können, ableiten, mein Problem ist, durch Design, dass, ich habe jetzt die Kontrolle über den Lebenszyklus der Einheit der Arbeit verloren. Früher habe ich die Arbeitseinheit ein kontextsensitives Objekt und das Repository würde einen Verweis auf sie über so etwas wie erhalten:

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

    // ...
}

Das vorherige Design erlaubte mir den Lebenszyklus der Einheit der Arbeit in meinem Code zu steuern, indem die Arbeitseinheit von einem UnitOfWorkFactory innerhalb einer using-Anweisung zu erstellen. Ich habe versucht, mehr von der Arbeit in den Händen der IoC-Container zu setzen, aber ich denke, ich habe tatsächlich einen Schritt zurück. Was sind Ihre Gedanken auf beide Implementierung?

War es hilfreich?

Lösung

Es ist in der Regel eine gute Sache, Ihren IoC-Container Griff so weit wie möglich zu lassen. Auf der Bahn in der Regel eine Einheit der Arbeitsmuster zu Beginn des Antrags erhalten initialisiert und am Ende begangen (zurückgesetzt, falls es Ausnahmen ist). Auf diese Weise Ihr Repository wird anstelle der unitofwork einen ISession im Konstruktor übernehmen. Auf diese Weise Ihr Repository müssen nicht mit zu begehen oder irgendetwas beschäftigen, und das wird für Sie automatisch behandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top