Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 76
1

Как в случае с Dependency Injection внедрять отдельный экземпляр некоторого класса только лишь для одного другого класса

10.01.2018, 12:08. Показов 771. Ответов 1
Метки нет (Все метки)

Здравствуйте, пытаюсь понять как же всё таки правильно использовать Dependency Injection в случае c ASP.NET Web Api2 и Entity Framework 6 (у меня в проекте Autofac, но это неважно).
У меня каркас такой, что в контроллеры внедряются классы-сервисы, а уже в них DbContext (не стал выделять IDbContext, так как DbContext это по сути тоже самое).
Допустим есть три класса, использующие DbContext: OrderService, UserService и некий EstimateService.
В моей логике первые два из них должны использовать один и тот же экземпляр DbContext, а третий (EstimateService) работает параллельно и должен иметь отдельный DbContext, чтобы спокойно параллельно обращаться к базе, при чём даже после обработки результата действия контроллера и отправки ответа (когда "заявка" создана, по ней запускается некий параллельный процесс рассчёта доп.данных).
В этой ситуации я не допонял какой тип жизненного цикла объектов правильно использовать? Сейчас у меня, получается, OrderService и UserService получают один и тот же экземпляр DbContext "за кулисами" через InstancePerApiRequest(), а для EstimateService приходится прямо в контроллере создавать отдельный экземпляр DbContext.

Мне кажется это не очень правильным создавать экземпляр DbContex прямо в контроллере. Подскажите, как средствами IoC-контейнера задать возможность автоматически для некоторого сервиса (у меня это estimateSerivce) выделять отдельный экземпляр DbContext? Можно на примере любого контейнера. То есть я хочу, чтобы по умолчанию для всех классов был один и тот же экземпляр DbContext (один на запрос), но именно для некоторого особенного класса - отдельный экземпляр DbContext.

Вот как выглядит сейчас конструктор контроллера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// регистрация DbContext
self.RegisterType<MyDbContext>()
    .As<DbContext>()
    .InstancePerApiRequest()
 
// конструктор контроллера 
public OrderController(
     IOrderService orderService,
     IUserService userService,
     Func<DbContext, IEtimateService> estimateServiceFactory
)
{
    _orderService = orderService,
    _userService = userService,
    _estimateSerivce = estimateServiceFactory(new MyDbContext()) // наверное это неправильно? Или нормально?
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2018, 12:08
Ответы с готовыми решениями:

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна...

1
1119 / 926 / 236
Регистрация: 15.06.2012
Сообщений: 3,635
Записей в блоге: 1
10.01.2018, 17:29 2
http://autofaccn.readthedocs.i... d-services

собственно, регаешь два и более с разными именами и где нужно -- подключаешь по имени.

для конструктора

https://stackoverflow.com/ques... -injection
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2018, 17:29

Можно ли как-то получить из одного класса исходный код другого класса?
Предположим есть два публичных класса. Один находится в одной части проекта, другой где-нибудь в...

Как переместить из стека одного класса в массив другого класса?
// HW_on.24.11_classStack_SantaClaus.cpp: определяет точку входа для консольного приложения. //...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru