Beachten Sie, dass ich eine ältere Version von Prism verwende und dass ich es mit dem UnityContainer verwende, aber dass dieselben Prinzipien gelten sollten.
Definieren Sie Ihre Modulklasse, um einen Container im Konstruktor zu übernehmen.
Hier ist ein Beispiel mit Unity:
public class Module : IModule
{
public static IUnityContainer Container;
public Module(IUnityContainer container)
{
Container = container;
}
}
Wenn Sie einen Konstruktor definieren, die einen Behälter nimmt, wird es durch die ApplicationBootstrapper.Run() -Methode aufgerufen.
Ich testete mit einem Standard-Konstruktor ohne Parameter und einem Überladungskonstruktor, der den Container übernimmt und der zweite Konstruktor aufgerufen wurde.
Ich überprüft auch mit nur den Standardkonstruktor und es wurde aufgerufen. Ich würde vorschlagen, Sie ändern Ihren Konstruktor, um einen Parameter hinzuzufügen, der einen Behälter nimmt.
Wenn Sie einen Container in Ihrer Modulklasse haben, können Sie Typen in Ihrer Initialize-Methode registrieren.
Wie für ServiceLocator, das ist ein etwas anderes Muster, das ich Ihnen empfehlen würde in Fällen verwenden, in denen Sie Ihre Abhängigkeiten nicht aus irgendeinem Grund vom Container erstellt werden können.
Während ich mit den Best Practices übereinstimme, wird in der Prism-Dokumentation eindeutig angegeben, dass Sie auch die Initialize-Methode Ihrer Methode verwenden können, um "Shared Services mit dem Abhängigkeitsinjektionscontainer der Anwendung zu registrieren". http://msdn.microsoft.com/en-us/library/gg405479%28v=pandp.40%29.aspx – Console
Wenn wir nicht über den Container wissen sollen, wie können dann Module neue Shared Services registrieren? – Benjamin
Der erwähnte 'ComposeExportedValue' ist eine Erweiterungs-Methode in' System.ComponentModel.Composition.AttributedModelServices' – jan