質問

MVVMデザインを備えたWPFアプリを開発しています。 MVVMフレームワークとして、Caliburn Microを使用しています。私は外部アセンブリに持っているサービスであり、MEFを使用してビューモデルクラスに注入されます。

奉仕の問題私は多くの小さなクラスを持っています、私は頑丈な王子を尊重しています。

[Export(typeof(IClassA)]
public class ClassA : IClassA
{}

[Export(typeof(IClassB)]
public class ClassB : IClassB
{}

[Export(typeof(IClassC)]
public class ClassC : IClassC
{}

//...
[Export(typeof(IClassK)]
public class ClassK : IClassK
{}

クラスカウントは約12〜15です。

ビューモデルクラスでこのクラスを使用する必要があります。だから私はこれを使用します:

public class MyViewModelClass
{
 private interface IClassA _a;
 private interface IClassB _b;
 private interface IClassC _c;


//...
 private interface IClassK _k;


[ImportingConstructor]
public MyViewModelClass(IClassA a, IClassB b, IClass c, ..., IClassK k)
{
_a=a; _b=b; _c=c; ...  _k=k

}

}

このように正しいのはそうではありません。または、エレガントでシンプルなものが存在します。ご意見とアドバイスに感謝します。

役に立ちましたか?

解決

MEFは、フィールド(プライベートなものでも)にインポートできます。あなたがあなたの人生を少し楽にしたいなら、あなたはだけでフィールドを飾ることができます ImportAttribute. 。すべての輸入がいつ終了したかを知りたい場合は、 IPartImportsSatisfiedNotification インターフェース:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a; 
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // add initialization code here
    }
}

これには、ViewModelが正しくインスタンス化されるようにMEFを使用する必要がありますが、シナリオに応じて大したことではないかもしれません。

他のヒント

宛先:ABE Heidbrecht。

私は少し混乱しています。これを使用する場合:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a;  // I need init _a?
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // what code must be here ?
        //how can I check if all import was success
    }
}

なぜなら。

IpartimportsSatisfiedNotificationには、単一の方法しかありません。これは、満たされる可能性のあるすべての輸入品が満たされたときに呼ばれます。

ビューモデルクラスのコンクストラクターのサービスクラスのユニットテストINITインターフェイスの方が良いと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top