Domanda

Ho una configurazione modello repository utilizzando NHibernate. La classe di base si presenta così:

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

    // ...
}

Come si può vedere, sto permettendo l'unità di lavoro per essere popolato tramite il costruttore (utilizzando StructureMap). Sto popolando gli oggetti repository sui miei servizi Web ASP.NET in questo modo:

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

    // ...
}

Come si può essere in grado di dedurre, il mio problema è che per mezzo del design, ora ho perso il controllo del ciclo di vita dell'unità di lavoro. In precedenza, ho fatto l'unità di lavoro un oggetto sensibile al contesto e il repository sarebbe ottenere un riferimento ad esso tramite qualcosa come:

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

    // ...
}

Questo progetto precedente mi ha permesso di controllare il ciclo di vita dell'unità di lavoro nel mio codice con la creazione di unità di lavoro da un UnitOfWorkFactory all'interno di un'istruzione using. Stavo cercando di mettere più del lavoro nelle mani del contenitore CIO, ma credo che in realtà ho fatto un passo indietro. Quali sono i tuoi pensieri su entrambi implementazione?

È stato utile?

Soluzione

Di solito è una buona cosa per far gestire il vostro contenitore CIO, per quanto possibile. Sul web un'unità di modello di lavoro di solito ottenere inizializzato all'inizio della richiesta e ha commesso alla fine (rollback se ci sono delle eccezioni). In questo modo il repository vorrà un ISession nel costruttore al posto del unitofwork. In questo modo, il repository non avrà a che fare con commettere o nulla e che saranno gestite automaticamente per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top