Pregunta

Tengo una configuración de patrón de repositorio utilizando NHibernate. La clase base es el siguiente:

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 se puede ver, estoy permitiendo que la unidad de trabajo que se rellena a través de la constructora (usando StructureMap). Estoy poblar los objetos del repositorio en mis servicios web ASP.NET, así:

[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 es posible que pueda deducir, mi problema es que por medio del diseño, ahora he perdido el control del ciclo de vida de la unidad de trabajo. Anteriormente, he hecho la unidad de trabajo un objeto sensible al contexto y el repositorio gustaría obtener una referencia a la misma a través de algo como:

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

    // ...
}

Este diseño anterior me permitió controlar el ciclo de vida de la unidad de trabajo en mi código mediante la creación de la unidad de trabajo de un UnitOfWorkFactory dentro de una instrucción using. Yo estaba tratando de poner más de la obra en las manos del contenedor IoC, pero creo que en realidad Di un paso hacia atrás. ¿Cuáles son sus pensamientos a cada aplicación?

¿Fue útil?

Solución

Por lo general, es una buena cosa para que su contenedor IoC manejar tanto como sea posible. En la web una unidad de patrón de trabajo por lo general que éste se inicia en el inicio de la solicitud y se comprometió en el extremo (deshace si hay alguna excepción). De esta manera su repositorio tomará un ISession en el constructor en lugar de la UnitOfWork. De esta manera, el repositorio no tendrá que hacer frente a la comisión o nada y que será manejado de forma automática.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top