Die übliche Prism-Methode zur Entwicklung komplexer Anwendungen besteht darin, dass jedes Modul eine IModule-Schnittstelle implementiert, um sich selbst zu initialisieren, damit es funktionieren kann. In den meisten Fällen geht es bei dieser "Initialisierung" darum, einige Typen bei einem IoC-Container zu registrieren. In unserem Fall sieht IModule also normalerweise so aus:
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.
}
}
Unsere Module haben normalerweise nur einen (oder sehr wenige) öffentliche Typen und viel mehr interne Klassen/Abhängigkeiten, die registriert werden müssen.
Ich bin ein wenig besorgt, ob dieser Ansatz das Prinzip der Kapselung durchbricht? Es scheint, dass wir alles (sowohl interne als auch öffentliche Typen) innerhalb eines globalen Containers registrieren, was die Grenze des Moduls verwischen könnte (die Registrierung öffentlicher und interner Typen ist völlig gleich) und es potenziell möglich macht, unsere "internen" Klassen an anderen Stellen aufzulösen.
Ist es nicht besser, interne Abhängigkeiten innerhalb eines ChildContainers zu registrieren?
Oder machen wir vielleicht etwas völlig falsch? :)