Обычный способ разработки сложных приложений Prism заключается в том, чтобы каждый модуль реализовывал интерфейс IModule для инициализации самого себя, чтобы он мог работать.В большинстве случаев эта «инициализация» в основном заключается в регистрации некоторых типов в контейнере IoC.Итак, в нашем случае IModule обычно выглядит следующим образом:
public class Module : IModule {
private IUnityContainer _container;
public Module(IUnityContainer container) {
_container = container;
}
public void Initialize() {
//register public types
_container.RegisterType<IMyPublicInterface, MyImplementation>();
//register internal dependencies
_container.RegisterType<IInternalDependency1, InternalDependency1>();
_container.RegisterType<IInternalDependency2, InternalDependency2>();
//..etc.
}
}
Наши модули обычно имеют только один (или очень мало) открытых типов и гораздо больше внутренних классов / зависимостей для регистрации.
Я немного волнуюсь, нарушает ли этот подход принцип инкапсуляции?Кажется, что мы регистрируем все (как внутренние, так и публичные типы) в одном глобальном контейнере, что может размыть границу модуля (регистрация публичных и внутренних типов абсолютно одинакова) и потенциально сделать возможным .Решение наших «внутренних» классовв других местах.
Не лучше ли зарегистрировать внутренние зависимости внутри ChildContainer?
Или, может быть, мы делаем что-то совершенно не так?:)