Репозиторий, IRepository и структура карты - PullRequest
1 голос
/ 17 мая 2011

У меня есть интерфейс IRepository и реализация EFRepository.
Я использую инъекцию структуры карты, чтобы получить реализацию репозитория.
В данный момент EFRepository имеет конструктор без параметров, поэтому Structuremap знает, как легко получать экземпляры в EFRepository.

Теперь мне нужно изменить реализацию репозитория, чтобы она получала параметр конструктора, который содержит единицу работы.

Мой вопрос в таком случае, как я использую Structuremap для возвратаэкземпляр, который инициализирован с единицей работы?

ПРИМЕР
До сегодняшнего дня я использовал:

using(IUnitOfWork uow=UnitOfWork.current) {
    IRepository rep = ObjectFactory.GetInstance<IRepository<T>>();
    //repository operations that uses UnitOfWork.current that initialized above
}// here dispose of UnitOfWork.current

Теперь я хочу использовать:

using(IUnitOfWork uow=new UnitOfWork()) {
    //Not sure is this is how I tell sructure map to use contractor that 
    //get IUnitOfWork)    
    IRepository rep = ObjectFactory.GetInstance<IRepository<T>>(uow);
    //repository operations that uses uow that initialized above
}// here dispose of UnitOfWork

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Я предполагаю, что ваша единица работы зависит от запроса ... Итак, у вас есть служба (WCF?), И каждый входящий запрос получает свою собственную единицу работы.

Затем вы можете настроить StructureMap для определения отдельной единицы работы для каждого HTTP-запроса. Если вам нужно модульное тестирование без HTTP-запросов, вы можете выбрать гибридный жизненный цикл: на HTTP-запрос ИЛИ на поток. StructureMap определит, что делать во время выполнения.

ObjectFactory.Configure(x => x.For<IUnitOfWork>()
              .HybridHttpOrThreadLocalScoped()
              .Use<MyUnitOfWork>());

Ваш класс, которому требуется инъекция конструктора, просто утверждает, что ему нужен IUnitOfWork:

public MyClass(IUnitOfWork unit) { ... }

Это, конечно, требует, чтобы MyClass также управлялся / создавался с использованием StructureMap.

1 голос
/ 17 мая 2011

Чтобы передать конкретный экземпляр в ObjectFactory, вы можете использовать «with»:

IRepository rep = ObjectFactory.With<UnitOfWork>(uow).
  GetInstance<IRepository<T>>();
...