Создание объектов Entity Framework с шаблоном Unity for Unit of Work/Repository
Я пытаюсь реализовать шаблон Unit of Work/Repository, как описано здесь: http://blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx
Для этого требуется, чтобы каждый репозиторий принимал реализацию IUnitOfWork, например, текстовые данные EF, расширенные частичным классом для добавления интерфейса IUnitOfWork. Я на самом деле использую.net 3.5, а не 4.0. Мой основной конструктор доступа к данным выглядит так:
public DataAccessLayer(IUnitOfWork unitOfWork,
IRealtimeRepository realTimeRepository)
{
this.unitOfWork = unitOfWork;
this.realTimeRepository = realTimeRepository;
}
Все идет нормально.
Я пытаюсь добавить Dependency Injection с помощью Unity Framework.
Получение контекста данных EF для создания с Unity было приключением, так как у него были проблемы с разрешением конструктора - в конце концов я создал другой конструктор в моем частичном классе с новым перегруженным конструктором и пометил его с помощью [InjectionConstructor]
,
[InjectionConstructor]
public communergyEntities(string connectionString, string containerName)
: this()
{
// ...
}
(Я знаю, что мне нужно передать строку соединения базовому объекту, который может подождать, пока все объекты не будут правильно инициализированы)
Таким образом, используя эту технику, я могу с удовольствием разрешить свой объектный объектный каркас как экземпляр IUnitOfWork следующим образом:
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<IUnitOfWork, communergyEntities>();
container.Configure<InjectedMembers>()
.ConfigureInjectionFor<communergyEntities>
(new InjectionConstructor("a", "b"))
DataAccessLayer target = container.Resolve<DataAccessLayer>();
// ...
}
Отлично. Теперь мне нужно создать ссылку на объект репозитория для DataAccessLayer - DAL нужно знать только интерфейс, поэтому я предполагаю, что мне нужно создать его экземпляр как часть оператора Unity Resolve, передав ему соответствующий Интерфейс IUnitOfWork.
В прошлом я бы просто передавал конструктору Repository строку соединения с БД, и он бы ушел, создал локальный объект Entity Framework и использовал его только на время существования метода Repository. Это отличается тем, что я создаю экземпляр Entity Framework как реализацию IUnitOfWork во время оператора Unity Resolve, и именно этот экземпляр мне нужно передать в конструктор хранилища - возможно ли это, и если да, то как?
Мне интересно, смогу ли я сделать хранилище свойством и пометить его как зависимость, но это все равно не решило бы проблему создания хранилища с объектом IUnitOfWork, с которым решается DAL
Я не уверен, правильно ли я понял этот шаблон, и с радостью посоветую, как лучше его реализовать - Entity Framework остается, но Unity можно заменить, если не лучший подход. Если у меня все это с ног на голову, пожалуйста, скажите мне
1 ответ
Это было перефразировано и получено ответ здесь: Unity Framework - повторное использование экземпляра
Решение состоит в том, чтобы использовать ContainerControlledLifetimeManager - он же Singleton: http://msdn.microsoft.com/en-us/library/dd203242.aspx