私は MEF と MVVM を実験しています。MEF に、文字列コンストラクター パラメーターを使用して NonShared ViewModel インスタンスを初期化させたいと考えました。つまり、次のようなものです。
// BarViewModel's constructor has one single string parameter
IBarViewModel bar = container.GetExportedValue<IBarViewModel>("bar title");
明らかに、MEF は私にこれをさせませんでした。
私はグーグルで検索しましたが、ExportFactory がこれに適したツールであると言う人もいますが、構文サンプルはありません。ExportFactory を使用してインスタンスをコンストラクターパラメーター (または非インポートパラメーターと言うべきか) で初期化する方法を理解できませんでした。
そこで、これを実現するために ViewModelFactory を使用しようとしました。この記事を参考にしました
そして、次のようなものを思いつきました:
[Export(typeof(IBarViewModelFactory))]
public class BarViewModelFactory : IBarViewModelFactory
{
[Import]
public Lazy<CompositionContainer> Container { get; set; }
public IBarViewModel CreateBarViewModel(string text)
{
IBarViewModel result = null;
var tempContainer = CreateTemporaryDisposableContainer(Container.Value);
try
{
result = new BarViewModel(text);
tempContainer.ComposeParts(result);
}
catch (Exception ex)
{
}
finally
{
}
return result;
}
基本的に私がここでやっていることは、(1) 別の場所からコンテナをインポートする (2) パラメータを使用して VM を新しくする (3) 一時的なコンテナを使用して、新しく作成されたインスタンスの依存関係を解決することです。
このコードは正常に動作しているように見えますが、(a) BarViewModel は [ImportingConstructor] を持つことができなくなりました (b) BarViewModel の [Import] プロパティは、ctor スコープで null であるため、コンストラクターで使用できません。
これは、ViewModel の使用が非常に制限されていることを意味し、MEF で次のようなクラスを初期化できないことも意味します。
[Import]
public ILogger Logger {get;set;}
[ImportingConstructor]
public SomeClass(IDataService service, string text)
{
Logger.Trace(text);
}
このクラスを MEF でインスタンス化する方法がわかりません。これは非常に一般的なシナリオだと思いますが、MEF はこれを処理できないのでしょうか?