DI внутри библиотеки. Где регистрировать типы?
От: xk Россия  
Дата: 26.12.10 18:59
Оценка:
Доброго времени суток!

Пишу приложение ASP.NET Web Forms, вся бизнес логика вынесена в классы сервисов, которые находятся в отдельном Class Library проекте.
Некоторые сервис-классы зависят от других сервис-классов, у всех них выделены интерфейсы.

Цель: очень хочеться инжектировать зависимости одних сервисов от других через конструкторы.
Вопрос: а где собственно регистрировать маппинги имплементаций на интерфейсы? Раньше DI использовал только внутри
проектов desktop приложений, там регистрация происходила при старте приложения.

При этом хочеться, чтобы регистрация проходила именно внутри проекта бизнес логики.

Приходит на ум только одно решение: сделать публичный статический метод InitializeLibrary() в котором будет происходить
регистрация и который будут дергать пользователи библиотеки.

Буду благодарен за любые посылы в нужную сторону
Использую Unity Application Block 2.0
Re: DI внутри библиотеки. Где регистрировать типы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 26.12.10 20:37
Оценка:
Здравствуйте, xk, Вы писали:

xk>Доброго времени суток!


xk>Пишу приложение ASP.NET Web Forms, вся бизнес логика вынесена в классы сервисов, которые находятся в отдельном Class Library проекте.

xk>Некоторые сервис-классы зависят от других сервис-классов, у всех них выделены интерфейсы.

xk>Цель: очень хочеться инжектировать зависимости одних сервисов от других через конструкторы.

xk>Вопрос: а где собственно регистрировать маппинги имплементаций на интерфейсы? Раньше DI использовал только внутри
xk>проектов desktop приложений, там регистрация происходила при старте приложения.

xk>При этом хочеться, чтобы регистрация проходила именно внутри проекта бизнес логики.


xk>Приходит на ум только одно решение: сделать публичный статический метод InitializeLibrary() в котором будет происходить

xk>регистрация и который будут дергать пользователи библиотеки.
У ASP.NET есть Application_Start в global.asax, там можешь вызвать что хочешь.

Для того чтобы инжектить в вебформы надо перехватывать событие HttpApplication.PreRequestHandlerExecute и сделать

container.BuildUp(this.Context.Handler);
Re[2]: DI внутри библиотеки. Где регистрировать типы?
От: xk Россия  
Дата: 27.12.10 05:49
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>У ASP.NET есть Application_Start в global.asax, там можешь вызвать что хочешь.


А если у меня еще есть Web сервис, использующий эту библиотеку, а еще пара консольных приложений — мне же придется
в каждом их них на старте регистрировать типы, а хочется в одном месте — внутри библиотеки..
может я чего-то не понимаю или мне хочется странного?
... << RSDN@Home 1.2.0 alpha 4 rev. 1445>>
Re[3]: DI внутри библиотеки. Где регистрировать типы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.12.10 08:11
Оценка: 3 (1)
Здравствуйте, xk, Вы писали:

xk>Здравствуйте, gandjustas, Вы писали:


G>>У ASP.NET есть Application_Start в global.asax, там можешь вызвать что хочешь.


xk>А если у меня еще есть Web сервис, использующий эту библиотеку, а еще пара консольных приложений — мне же придется

xk>в каждом их них на старте регистрировать типы, а хочется в одном месте — внутри библиотеки..
xk>может я чего-то не понимаю или мне хочется странного?

Видимо не понимаешь. Код библиотеки в каком-то месте вызвать надо, без этого никак. В ASP.NET 4 в принципе есть способы это обойти но не всегда сработают. Например у тебя есть две библиотеки, которым надо регистрировать типы, они должны их регистрировать в одном контейнере. Тебе надо будет явно вызвать методы обоих библиотек и передавать им контейнер.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.