Платформа Unity — повторное использование экземпляра
-
18-09-2019 - |
Вопрос
никому не понравился мой первый вопрос по этому поводу:Создание объектов Entity Framework с помощью шаблона Unity для единицы работы/репозитория
так что мне удалось перефразировать это так, чтобы вы могли читать, не засыпая и не теряя желания жить.
Я создаю объект DataAccessLayer, который принимает в конструкторе два интерфейса:IUnitOfWork и IRealtimeRepository:
public DataAccessLayer(IUnitOfWork unitOfWork,
IRealtimeRepository realTimeRepository)
{
this.unitOfWork = unitOfWork;
this.realTimeRepository = realTimeRepository;
}
Теперь конструктор реализации IRealtimeRepository также принимает параметр IUnitOfWork:
public DemoRepository(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
Затем в настройке контейнера Unity я добавляю две реализации:
container.RegisterType<IUnitOfWork, communergyEntities>();
container.RegisterType<IRealtimeRepository, DemoRepository>();
происходит следующее: Unity создает 2 новых экземпляра IUnitOfWork (фактически контекст данных Entity Framework), один для конструктора DataAccessLayer, один для конструктора DemoRepository.
Поскольку это касается шаблона «Единица работы», очень важно, чтобы один и тот же экземпляр использовался повторно.Есть идеи?Я вижу, что подобные вопросы уже задавались, но не были приняты.
Решение
Вы можете указать Unity использовать Контейнерконтролледлайфтимеманер:
container.RegisterType<IUnitOfWork, communergyEntities>(new ContainerControlledLifetimeManager());
Альтернативно вы можете использовать RegisterInstance
вместо RegisterType
, хотя его необходимо создать во время регистрации:
container.RegisterInstance<IUnitOfWork>(new CommunergyEntities());