Ограничить внедрение зависимостей на уровне проекта

У меня есть веб-проект 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)


Для этого можно явно использовать два корня композиции. Настройте контейнер, как обычно для веб-приложения.

Затем на уровне обслуживания используйте некоторый код, чтобы выполнить инициализацию контейнера только один раз (загрузчик). Затем в каждой точке входа в слое сервиса вы запрашиваете внутренние объекты для уровня, используя свой контейнер (локатор сервиса). Таким образом, внешние проекты не смогут вмешиваться в ваши привязки уровня сервиса.

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

person cvbarros    schedule 13.03.2014