Создание объектов 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

Другие вопросы по тегам