Каков наилучший подход для совместного использования UnitOfWork между двумя репозиториями, использующими Unity? - PullRequest
0 голосов
/ 25 января 2012

Я хочу использовать Unity в качестве IoC помимо шаблонов UnitOfWork и Repository. Я прочитал различные связанные статьи и вопросы, но ни один из них не удовлетворил меня полностью. У меня проблема со всеми подходами. Пример лучше объяснит мою проблему:

Мы хотим работать с двумя репозиториями в двух отдельных классах (возможно, бизнес-сервисах), но общая работа ведется единым блоком.

Начальной точкой является метод LocalService1.Method1.

public class LocalService1
{
    public void Method1(int id)
    {
        var repository1 = Container.Current.Resolve<IRepository1>(); // Injects the IUnitOfWork for the repository.
        var entity1 = repository1.GetEntity1(id);
        var service2 = Container.Current.Resolve<LocalService2>(); // Maybe it’s better not to use IoC for business logic. This is not my issue.
        service2.Method2(entity1)
    }
}
...
public class LocalService2
{
    public void Method2(Entity1 entity1)
    {
        var repository2 = Container.Current.Resolve<IRepository2>(); // Injects the IUnitOfWork for the repository.
        var count = repository2.GetEntity2sCount(entity1.Id);
        // Do some works with count and entity1
    }
}

Основной вопрос заключается в том, «Как я могу совместно использовать UnitOfWork (здесь может быть ObjectContext) между IRepository1 и IRepsitory2 при вызове LocalService1.Method1?». Более важно то, что «я хочу быть уверен в утилизации UnitOfWork».

Полагаю, ответы будут сосредоточены на следующих вопросах:

  • Конфигурация IoC
  • Конфигурация времени жизни
  • Время утилизации (как и когда?)

Если вы рекомендуете использовать «HttpContext», обратите внимание на не веб-среды.

Я знаю, что мой вопрос почти касается «управления временем жизни», но я ищу исчерпывающий подход.

1 Ответ

1 голос
/ 25 января 2012

Во-первых: не используйте Unity в качестве ServiceLocator.Это считается анти-паттерном .Вместо этого используйте инъекцию в конструктор .

LifetimeManager от Unity не убирает за собой.Эта функция включена в список желаний для Unity vNext .

Если вы хотите, чтобы ваши объекты были утилизированы, вы должны создать свой собственный LifetimeManager и связанный BuilderStrategy, которые очищают.

В проекте TecX (внутри TecX.Unity.Lifetime) есть пример, взятый из книги Марка Симанна Внедрение зависимостей в.NET .

...