Я прочитал вопрос Ioc/DI - Why do I have to reference all layers/assemblies in entry application?В каких случаях следует заказывать регистрацию зависимостей?
Таким образом, в растворе Asp.Net MVC5, корень композиции находится в проекте MVC5 (и имеющий узел, отвечающий за внедрение зависимости всех регистраций не имеет смысла).
Внутри этой картинки мне непонятно, какой лучший подход среди следующих.
Подход 1
Конкретные реализации являются public class ...
и все регистрации положения централизованы в пределах корня композиции (например, в одном или более файлов в папке CompositionRoot). Проект MVC5 должен ссылаться на все сборки, обеспечивающие привязку хотя бы одной конкретной реализации. Никакая библиотека не ссылается на библиотеку DI. Проект MVC может содержать интерфейсы, которые должны быть связаны без каких-либо недостатков.
подход 2
Конкретные реализации являются internal class ...
. Каждая библиотека предоставляет локальный обработчик конфигурации DI. Например,
public class DependencyInjectionConfig {
public static void Configure(Container container) {
//here registration of assembly-provided implementations
//...
}
}
, который должен зарегистрировать свои собственные реализации. Корень композиции запускает регистрацию, вызывая все методы Configure()
, всего по одному для каждого проекта. Проект MVC5 должен затем ссылаться на все сборки, обеспечивающие привязку хотя бы одной конкретной реализации. Библиотеки must ссылка библиотека DI. В этом случае проект MVC5 не может содержать интерфейсы (в противном случае была бы круговая ссылка): для привязки общедоступных интерфейсов потребуется сборка ServiceLayer.
подход 3
То же, что подход 2, но локальные модули конфигурации обнаруживаются динамически с помощью сборки отражения (по соглашению?). Поэтому проект MVC5 не ссылается на библиотеки. Проект MVC может содержать и может ссылаться на библиотеки. Библиотеки must ссылка библиотека DI.
Какова наилучшая практика здесь? Есть ли другая возможность?
* EDIT (2016-12-22) * Благодаря полученным ответам, я опубликовал this github project описывая лучшее решение, которое я нашел до сих пор.
Это не очень ясно для меня, что именно вы спрашиваете здесь. Я чувствую, что вам не хватает точки контейнеров IoC/DI. Имея все в CompositionRoot, вы затем полагаетесь на абстракции (интерфейсы/абстрактные классы) и легко вводите другое поведение (через конкретные иммы). – Wjdavis5
Мой вопрос: где вы размещаете свои (тонны) правил конфигурации контейнеров, где интерфейсы и реализации распространяется на решение, состоящее из двадцати проектов? – Marcello
Я думаю, это действительно зависит от вашего проекта. Например, у меня около 50 проектов в sln для очень большого сервиса. Но есть только один exe. Мои правила инициализируются как часть запуска exe. Если вы находитесь в ситуации, когда есть много допустимых точек входа, вы хотите, чтобы ваши правила настраивали @ каждую точку входа.Что не должно быть так сложно, если вы наследуете класс EXE от общего базового класса, который затем будет содержать правила. – Wjdavis5