2011-06-19 21 views
1
[Export] 
public class MyViewModel : NotificationObject 
{ 
    public MyViewModel(Foo foo) 
    { 
     DoWorkCommand = new DelegateCommand(DoWork); 

     MyFoo = foo; 
    } 

    [Import] 
    private IBarService MyBarService { get; set; } 

    public Foo MyFoo { get; private set; } 

    public DelegateCommand DoWorkCommand { get; set; } 

    public void DoWork() 
    { 
     MyBarService.DoSomething(MyFoo); 
    } 
} 

MyViewModelクラスのインスタンスをパラメータで渡すことはできますか?私はおそらくExportFactor<T>が私にいくつかのパラメータを渡すだろうと思ったが、そうではない。だから、私が達成しようとしていることを説明するパターンがありますか?MEF - パラメータで初期化する方法はありますか?

単にnew()を実行すると、MyBarServiceがnullのままであるため、カットされません。私はExportAttributeを削除し、ComponentInitializer.SatisfyImports(this)を使用してnew()を使用すると考えましたが、そのようにすると新しいものにする必要があります。私は両方の世界のベストを期待していました...パラメータを使って何かをインポートする方法がいくつかあります。私はまだデカップリングされていますが、パラメータを設定してViewModelのインスタンスを生成することができます。

答えて

0

MEFは、例えば、私が行うことができ、depedency注入をサポートしています。

[ImportingConstructor] 
public MyViewModel(Foo foo) 
{ 

} 

そしてMEFは自動的に試してみて、私のコンストラクタにFooのインスタンスを注入します。おそらく、あなたはあなたの構成された部分にあなたの必要なサービスを注入するために、このメカニズムを使用することができますか?

+0

いいえFooにExportAttributeが設定されていない限り、これは機能しません。その時点で、ImportAttributeでフィールドにマークを付けるだけで済みます。 – michael

0

輸入者から輸出者にいくつかのパラメータを渡す場合は、エクスポートするクラスまたはインタフェースにInitializeメソッドを置くことができます。このような何か:次に

[Export] 
public class MyViewModel : NotificationObject 
{ 
    public MyViewModel() 
    { 
     DoWorkCommand = new DelegateCommand(DoWork); 
    } 

    public void Initialize(Foo foo) 
    { 
     MyFoo = foo; 
    } 

    [Import] 
    private IBarService MyBarService { get; set; } 

    public Foo MyFoo { get; private set; } 

    public DelegateCommand DoWorkCommand { get; set; } 

    public void DoWork() 
    { 
     MyBarService.DoSomething(MyFoo); 
    } 
} 

輸入側のExportFactoryを使用し、輸出の新しいインスタンスを作成した後Initializeメソッドを呼び出します。

+0

これは動作しますが、問題を引き起こす可能性があります: 'public readonly int SomeNumber;' ...初期化では設定できませんが、コンストラクタはそうです。 –

関連する問題