Шаблон единицы работы в рамках asp.net mvc приложение

Я смотрел на этот превосходный блог, названный "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.

6
задан user919426 7 August 2016 в 19:54
поделиться

2 ответа

С единичной моделью работы не каждый метод доступа к данным помещается в отдельную единицу работы. Вы используете единицу работы вокруг всей работы, которую необходимо выполнить, что в большинстве случаев является в веб-приложении веб-запросом. Идея заключается в том, что запрос может провалиться или увенчаться успехом. Когда вы добавляете 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);
     }
}
4
ответ дан 17 December 2019 в 02:29
поделиться

Я думаю, что 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

.
2
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: