2017-12-30 4 views
0

Ich baue ein Programm auf Unity 5 und Prism 7. Ich möchte, dass mein Programm sehr modular ist, damit es sich korrekt verhält, wenn einige Module nicht verfügbar sind.Unity-Framework löst optionale Option nicht auf

Dafür möchte ich optionale Abhängigkeiten mit [OptionalDependency] Attribut markieren und eine Klasse mit ihnen selbst entscheiden, was zu tun ist, wenn null im Konstruktor übergeben wird.

Aber wenn ich eine Abhängigkeit mit diesem Attribut markiere, löst Unity es nicht auf und übergibt einfach null anstelle der Abhängigkeitsinstanz, obwohl das Modul wie gewöhnlich verfügbar ist.

Wie mache ich Abhängigkeit als wirklich schön zu haben?

Oder eine andere Möglichkeit, wie mache ich Unity nicht werfen, wenn Abhängigkeit nicht aufgelöst werden können, und nur null stattdessen passieren und die Konstruieren Klassen entscheiden, was wir zu tun?

Da ist App.xaml.cs meines Programm:

public partial class App : PrismApplication 
{ 
    protected override Window CreateShell() 
    { 
     InitializeModules(); 
     this.ShutdownMode = ShutdownMode.OnMainWindowClose; 
     var shell = Container.Resolve<Shell>(); 
     this.MainWindow = shell; 
     return shell; 
    } 

    protected override void RegisterTypes(IContainerRegistry containerRegistry) { } 

    /// <summary> 
    /// Creating catalog of Modules from .dlls in "Modules" folder 
    /// </summary> 
    protected override IModuleCatalog CreateModuleCatalog() 
    { 
     var catalog = new DirectoryModuleCatalog() { ModulePath = @"./Modules" }; 
     catalog.Initialize(); 
     // by the way, modules aren't getting recognized without 
     // catalog.Initialize() or InitializeModules in CreateShell. 
     // Should it be such as that? Seems to me like no.. 
     return catalog; 
    } 
} 

Neben Hauptfrage, ich schätze irgendwelche Vorschläge, wie meinen Code besser in den Kommentaren unter der Frage zu machen, weil ich ein noob in Prism + Unity bin. Vielen Dank!

Antwort

0

Dieser Ansatz ist keine gute Idee. Konstruktorinjektion bedeutet, dass die Abhängigkeiten benötigt werden. Außerdem glaube ich nicht, dass das OptionalDependencyAttribute im ctor funktioniert, sondern vielmehr auf eine Eigenschaft angewendet werden muss. Versuchen Sie, eine Eigenschaft zu erstellen und das Attribut darauf anzuwenden.

Der gesamte Code in der CreateShell-Methode wird nicht benötigt. Nur return Container.Resolve<Shell>() und das war's.

Auch die Module, die nicht geladen werden, sind ein Fehler, der behoben wurde und in der neuesten Prism CI-Bibliothek auf MyGet verfügbar ist.

+0

Warum OptionalDependency Attribut kann dann auf Parameter angewendet werden? Ich sehe keine andere Verwendung von Markierungsparametern neben den Konstruktorparametern. Und ich bin mit MyGet zu Prism 7.0.0.344-ci gewechselt und es funktioniert immer noch nicht ohne 'InitializeModules();' in CreateShell, weil es eines der Module, die in meinem Shell View Model Konstruktor benötigt werden, nicht auflösen kann. – 1valdis

+0

Auch ich lese, dass die Implementierung von IModule und die Modulfunktionalität selbst streng in verschiedenen Klassen sein sollte, so dass die Funktionalität nicht vom verwendeten Container abhängt. Aber Property Injection bedeutet, dass mein Dienst IModule sein muss oder zumindest einen Verweis darauf haben muss, um sein Eigentum zu erhalten. Was sollte ich wählen, und gibt es einen anderen Weg? – 1valdis

+0

Sie müssen das Unity-Team nach dem Attributverhalten fragen. Wenn Sie zu einer Eigenschaft wechseln, hat es gewunken? Die Shell wird zuerst vor beliebigen Modulen erstellt. Sie können keine Moduldienste in der Shell anfordern. Wenn die Shell Abhängigkeiten aufweist, müssen sie im Shell-Projekt und nicht in einem Modul registriert sein. Ich verstehe deine andere Frage nicht. Klingt nach Code-Geruch für mich (etwas stimmt nicht mit dem Design). –

Verwandte Themen