2017-12-30 26 views
0

私はUnity 5とPrism 7でプログラムを構築しています。私のプログラムは非常にモジュール化したいので、いくつかのモジュールが利用できない場合、正しく動作するようにします。Unity Frameworkが解決しないOptionalDependency

このために、[OptionalDependency]属性のオプションの依存関係をマークして、nullがコンストラクタで渡された場合に何をすべきかをクラスに任せます。

しかし、この属性の依存関係をマークすると、Unityはそれを解決せず、モジュールが通常どおり利用可能であるにもかかわらず、依存インスタンスの代わりにnullを渡します。

にはどうすればを持っていることは本当に素敵として依存関係を作るのですか?

それとも別のオプション

は、どのように私は依存関係が解決できないときを投げる、とだけではなく、 nullを渡し、構築クラスが何をすべきかを決めさせない にUnityに作るのですか?

は私のプログラムのApp.xaml.csあります:私はプリズム+ユニティでnoobのだから

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; 
    } 
} 

主な質問のほかに、私は、質問の下のコメントでより良い私のコードを作成する方法上の任意の提案を感謝しています。ありがとうございました!

答えて

0

この方法はお勧めできません。コンストラクタインジェクションとは、依存関係が必要であることを意味します。また、私はOptionalDependencyAttributeがctorで動作するとは思っていませんが、むしろプロパティに適用する必要があります。プロパティを作成して属性を適用してみてください。

CreateShellメソッドのコードはすべて必要ありません。ちょうどreturn Container.Resolve<Shell>()とそれだけです。

また、ロードされていないモジュールは修正され、最新のPrism CI biuld MyGetで利用可能です。

+0

なぜOptionalDependency属性をパラメータに適用できるのですか?私は、コンストラクタのパラメータの横にパラメータをマーキングする他の使用方法は見当たりません。そして私はPrism 7.0.0.344-ciにMyGetを使って移動しましたが、シェルビューモデルのコンストラクタで必要なモジュールの1つを解決できないため、CreateShellで 'InitializeModules();'がなければまだ動作しません。 – 1valdis

+0

また、IModuleの実装とモジュールの機能自体は厳密には異なるクラスにする必要があり、その機能は使用するコンテナに依存しないようにする必要があります。しかし、プロパティインジェクションとは、自分のサービスがIModuleであるか、少なくともそのプロパティを取得するためのリファレンスを持っていなければならないということです。私は何を選ぶべきですか、それ以外の方法はありますか? – 1valdis

+0

Unityチームに属性の動作について尋ねる必要があります。あなたがプロパティに変更した場合、それは覚えましたか? シェルは、どのモジュールよりも先に作成されます。シェルでモジュールサービスを要求することはできません。シェルに依存関係がある場合は、モジュールではなくシェルプロジェクトに登録する必要があります。 私はあなたの他の質問を理解していません。コードの臭いのように聞こえます(デザインに何か問題があります)。 –

関連する問題