Я смотрел на этот превосходный блог, названный "NHibernate и Шаблон Единицы работы", и имею вопрос относительно лучшего места для использования UnitOfWork. Запустите в asp.net mvc проект.
Мой SLN разломан на следующие проекты:-
MVC project
Repository
NHibernateUnitOfWork
У меня есть интерфейс:-
public interface INameRepository
...
IList GetByOrigin(int OriginId)
...
У меня есть конкретная реализация
public class NameRepository : INameRepository
...
public IList GetByOrigin(int OriginId) {
using (UnitOfWork.Start()) {
var query = session.Linq<...
return query;
}
}
...
Мой вопрос, делают я переношу все свои методы во всех моих репозиториях с использованием (UnitOfWork. Запустите ()) или есть ли лучший подход?
Я использую nHibernate, asp.net mvc.
С единичной моделью работы не каждый метод доступа к данным помещается в отдельную единицу работы. Вы используете единицу работы вокруг всей работы, которую необходимо выполнить, что в большинстве случаев является в веб-приложении веб-запросом. Идея заключается в том, что запрос может провалиться или увенчаться успехом. Когда вы добавляете 2 элемента в базу данных в течение одного запроса, они оба должны быть добавлены, или нет. А не только один из них. В большинстве случаев самый простой способ начать единицу работы в mvc (или другом веб-приложении) - это в методах начального и конечного запроса global.asax
class Global
{
BeginRequest()
{
servicelocater.get<unitofwork>().start();
}
EndRequest()
{
var unit = servicelocater.Get<Unitofwork>();
try
{
unit.commit();
}
catch
{
unit.rollback();
throw;
}
}
}
class Repository<T>
{
public Repository(INHibernateUnitofwork unitofwork)
{
this.unitofwork = unitofwork;
}
public void Add(T entity)
{
unitofwork.session.save(entity);
}
}
Я думаю, что Sharp Architecture решает это довольно хорошо. Что они делают, так это помещают единицу работы внутрь фильтра действий MVC ASP .Net. В принципе, вы можете определить фильтр транзакций Action, например,
public class TransactionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
UnitOfWork.Start();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
UnitOfWork.Stop();
}
}
, и в классе контроллера поместить атрибут Transaction в метод Action Result
.