如何在Prism4 MEF中创建我的类的实例?

时间:2011-03-01 11:37:14

标签: c# prism mef prism-4

我已配置容器:

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。 MyModule的

[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?**
    }
}

1 个答案:

答案 0 :(得分:3)

您执行此操作的方式与MainWindow方法覆盖中CreateShell的实例相同。您所要做的就是调用Container.GetExportedValue<T>(),这样您就可以直接获取实例。但是,如果您希望注入一个类型,为了更松散耦合,您需要具有依赖于该类型(或最好是接口)的[ImportingConstructor]属性的构造函数,或者该类型的属性具有[Import]属性。

通过使用[Export]属性修饰类,并确保将程序集添加到AggregateCatalog,确保导出了类型。

希望这会有所帮助;)