Репозитории, UnitOfWork и Unity - PullRequest
       43

Репозитории, UnitOfWork и Unity

0 голосов
/ 04 августа 2011

Использование Unity, когда я «создаю» новый объект, для которого требуются зависимости, т.е. репозитории, UnitOfWork - все отлично, мой новый объект получает зависимости, а «новый» объект контролирует UnitOfWork, репозитории, так как они также требуютЗависимость UnitOfWork также вводится с помощью того же UnitOfWork (с использованием менеджера времени жизни PerResolve).

Все хорошо, однако у меня возникает проблема с областью действия этого UnitOfWork и репозитории на уровне класса.

Что если я хотел бы, чтобы время жизни UnitOfWork контролировалось на уровне метода, как мне подойти к этому ??Должен ли я использовать метод инъекций?Если так, то должен ли мой метод снова брать все необходимые зависимости, например, репозитории и UnitOfWork ??

Некоторые рекомендации будут с благодарностью.

Ответы [ 3 ]

1 голос
/ 08 августа 2011

На самом деле, сохраняйте единицу работы (обертка с DbContext) для каждого запроса.Если вы используете мудрый метод, это будет дорогостоящим решением.Например,

public void SaveAccount(Account account)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
       new Repository<Account>(unitOfWork).Attach(account);
       unitOfWork.Commit();           
    }       
}

public Account GetAccount(int id)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
      return new Repository<Account>(unitOfWork).Get(id);
    }
}

public void MakePayment(int fromAccount, int toAccount, decimal ammount)
{
   var from = Dao.GetAccount(fromAccount);
   var to = Dao.GetAccount(toAccount);
   from.Total -= amount;
   to.Total += amount;
   Dao.SaveAccount(from);
   Dao.SaveAccount(to);
}

Мы используем 4 разных подключения к базе данных в одном методе, а также небезопасное использование транзакций.Пользователь под запрос базовой единицы работы может в качестве контейнера использовать HttPContext.

0 голосов
/ 08 августа 2011

Поиск в StackOverflow, по-видимому, предлагает вытащить Http Request Lifetime Manager из проекта MVC здесь:

http://mvcunity.codeplex.com/

Поскольку у самого Unity нет собственного времени жизни Http-запросаManager.

Другие вопросы:

Как внедрить зависимости для запроса http (или для контекста http) с unity 2.0 и asp.net mvc

Использование сессии ASP.NET для управления временем жизни (Unity)

0 голосов
/ 08 августа 2011

Вы не должны использовать DI для параметра метода, по крайней мере, не напрямую.

Обычный подход состоит в том, чтобы иметь IUnitOfWorkFactory или что-то подобное. Получите , что из контейнера. Затем в вашем методе вызовите фабрику, чтобы получить объект вашей единицы работы. Фабрика может (или не может) возвращаться к контейнеру для выполнения своей работы.

...