Единица работы и шаблон хранилища
У меня есть настройка шаблона репозитория с использованием NHibernate. Базовый класс выглядит следующим образом:
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);
}
// ...
}
Как вы можете видеть, я разрешаю заполнять единицу работы через конструктор (используя StructureMap). Я заполняю объекты репозитория на своих веб-сервисах ASP.NET, например:
[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);
}
// ...
}
Как вы можете это сделать, моя проблема заключается в том, что с помощью дизайна я теперь потерял контроль над жизненным циклом единицы работы. Раньше я делал блок работы объектом, чувствительным к контексту, и репозиторий получал бы ссылку на него через что-то вроде:
public class NHibernateRepositoryBase<T> : IRepository<T>
{
public T Get(object id)
{
return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
}
// ...
}
Этот предыдущий проект позволил мне контролировать жизненный цикл единицы работы в моем коде, создав единицу работы из UnitOfWorkFactory в операторе using. Я пытался поставить больше работы в руки контейнера IoC, но я думаю, что я сделал шаг назад. Что вы думаете о реализации?
Ответы
Ответ 1
Как правило, хорошо, чтобы ваш контейнер IoC обрабатывал как можно больше. В Интернете блок рабочего шаблона обычно инициализируется в начале запроса и фиксируется в конце (откат, если есть какие-то исключения). Таким образом, ваш репозиторий займет ISession в конструкторе вместо unitofwork. Таким образом, вашему репозиторию не придется иметь дело с совершением или чем-либо, и это будет автоматически обрабатываться для вас.