Pergunta

Eu tenho uma configuração de padrão de repositório usando o Nibernate. A classe base é assim:

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

    // ...
}

Como você pode ver, estou permitindo que a unidade de trabalho seja preenchida através do construtor (usando o StructureMap). Estou preenchendo os objetos do repositório nos meus serviços da Web do ASP.NET como assim:

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

    // ...
}

Como você pode deduzir, meu problema é que, por meio de design, perdi o controle do ciclo de vida da unidade de trabalho. Anteriormente, fiz a unidade de trabalho um objeto sensível ao contexto e o repositório obteria uma referência a ele através de algo como:

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

    // ...
}

Esse design anterior me permitiu controlar o ciclo de vida da unidade de trabalho no meu código, criando a unidade de trabalho a partir de uma unidade de trabalho em uma instrução usando. Eu estava tentando colocar mais do trabalho nas mãos do contêiner do COI, mas acho que dei um passo para trás. O que você acha da implementação?

Foi útil?

Solução

Geralmente, é uma coisa boa deixar o seu contêiner do COI o máximo possível. Na Web, uma unidade de padrão de trabalho geralmente é inicializada no início da solicitação e comprometida no final (revertida se houver alguma exceção). Dessa forma, seu repositório levará uma isamento no construtor em vez da unidade de trabalho. Dessa forma, seu repositório não precisará lidar com se comprometer ou algo assim e isso será tratado automaticamente para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top