2011-01-14 7 views
0

MVVMデザインのwpf appを開発します。 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 

} 

} 

私はこの方法が正しいとは思わない。あるいは、エレガントでシンプルなものが存在します。あなたの意見やアドバイスをいただきありがとうございます。

答えて

0

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を使用する必要がありますが、あなたのシナリオに応じてそれはないかもしれません大したことである。

1

To: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には、OnImportsSatisfiedという1つのメソッドしかありません.OnImportsSatisfiedは、満たすことができるすべてのインポートが満たされたときに呼び出されます。

私は、ビューモデルクラスのcontructorでサービスクラスのinitインターフェイスをテストする方が良いと思います。

+0

すべてのインポートが成功しない限り、OnImportsSatisfiedは呼び出されません。基本的に、そのメソッドに入るコードは、あなたのコンストラクタで通常オブジェクトを初期化するためにコンストラクタに置くコードです。インポートはコンストラクターで使用できないため、そのメソッドが呼び出されるまで使用することはできません。いずれかのインポートを満たすことができない場合は、通常のMEF例外がスローされ、エクスポートが不足していることが警告されます。 –

+0

沖、説明ありがとう –

関連する問題