Ограничете инжектирането на зависимости до слоя на проекта

Имам уеб проект ASP.NET, който препраща към библиотека от класове на сервизен слой. Използвам инжектиране на зависимости, което настройвам в уеб слоя. Искам да се възползвам от инжектирането на зависимости и в двата проекта. Но не искам уеб слоят да може да инжектира определени реализации от сервизния слой.

Например, използвам рамка на обект в слоя на услугата, за да инжектирам хранилища на обекти в класове услуги, въпреки че не искам уеб слоят да има достъп за инжектиране на тези хранилища на обекти.

Има ли начин да се постигне това?

Играя си с Ninject и AutoFac, така че примерите, използващи някой от тях, биха били добре.


person Andrew    schedule 12.03.2014    source източник
comment
можете ли да покажете конкретен пример за код? Трудно е да се каже на какъв проблем се натъквате   -  person Caleb    schedule 13.03.2014
comment
Защо искате да постигнете това? Това може да ни помогне да разберем по-добре каква е целта. Написал съм много проекти, използвайки di, но никога не е трябвало да правя това.   -  person matt_lethargic    schedule 13.03.2014
comment
Според моя пример, кажете, че имате сервизен слой, съдържащ сервизни класове и обекти (с помощта на EF). Сега искам да инжектирам тези обекти в услуги. Въпреки че в уеб слоя също мога да инжектирам тези обекти. Искам уеб слоят да премине през съответната услуга, за да има достъп до обекти, а не да има директен достъп до обекти. Може би ставайки малко по-конкретни, ако променя класовете на обекти и интерфейса си от публичен на вътрешен, това ще ги скрие от уеб слоя, но мога ли да използвам инжектиране на зависимости, тъй като контейнерът е настроен в уеб слоя?   -  person Andrew    schedule 13.03.2014
comment
Няма никакъв смисъл. Ако те са вътрешни/частни, няма да можете да ги инжектирате, нито да настроите контейнера вътре в уеб слоя, тъй като кодът за настройка няма да види класовете.   -  person cvbarros    schedule 13.03.2014
comment
Свързани: stackoverflow.com/q/9501604/126014   -  person Mark Seemann    schedule 13.03.2014


Отговори (1)


Можете изрично да използвате два композиционни корена за тази цел. Настройте контейнера както обикновено за вашето уеб приложение.

След това във вашия сервизен слой използвайте някакъв код, за да извършите инициализация на контейнера само веднъж (bootstrapper). В рамките на всяка входна точка във вашия сервизен слой вие след това питате за вътрешни обекти към слоя, като използвате вашия контейнер (сервизен локатор). По този начин външните проекти няма да могат да се намесват в обвързванията на вашия сервизен слой.

Друг начин (с Ninject) е да използвате модули, въпреки че това няма да предпази външния проект от замяна на обвързвания. Но можете поне да постигнете разделяне на проблемите и да декларирате обвързванията близо до мястото, където се използват. Нещата, които се инжектират в уеб слоя, се декларират в WebModule, сервизния слой Service Module и т.н.

person cvbarros    schedule 13.03.2014