2

コンテナを構成しました:

public class MyBootstrapper : MefBootstrapper  
{  
    protected override void ConfigureAggregateCatalog()
    {
        AggregateCatalog.Catalogs.Add(xxx.Assembly));
// other assemblies
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();
        Application.Current.MainWindow = (MainWindow)Shell;
        Application.Current.MainWindow.Show();
    }

    protected override DependencyObject CreateShell()
    {
        return Container.GetExportedValue<MainWindow>();
    }
}

モジュールでタイプ T のインスタンスを作成するにはどうすればよいですか? 型 T は、MEF によって構成されるアセンブリのどこかに定義されています。

私はこのようなものが必要です:

var myType = XXXX.Resolve<T>();

UPD1. マイモジュール

[ModuleExport(typeof(CatalogModule))]
public class CatalogModule : IModule
{
    private readonly IEventAggregator _event;
    private readonly IUIManager _uiManager;

    [ImportingConstructor]
    public CatalogModule(IEventAggregator @event, IUIManager uiManager)
    {
        _event = @event;
        _uiManager = uiManager;
    }

    private void Foo()
    {
        var vm = **How create instance of desired type here?**
    }
}
4

1 に答える 1

3

メソッドのオーバーライドMainWindowでのインスタンスを取得したのと同じ方法でそれを行います。CreateShellを呼び出すContainer.GetExportedValue<T>()だけで、インスタンスを直接取得できます。ただし、型を注入したい場合は、より疎結合にするために、[ImportingConstructor]その型 (またはできればインターフェイス) に依存する属性を持つコンストラクター、または[Import]属性を持つその型のプロパティが必要です。

[Export]クラスを属性で装飾することにより、型がエクスポートされていること、およびアセンブリが に追加されていることを確認してくださいAggregateCatalog

お役に立てれば ;)

于 2011-03-01T12:23:59.097 に答える