我已配置容器:
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?**
}
}
答案 0 :(得分:3)
您执行此操作的方式与MainWindow
方法覆盖中CreateShell
的实例相同。您所要做的就是调用Container.GetExportedValue<T>()
,这样您就可以直接获取实例。但是,如果您希望注入一个类型,为了更松散耦合,您需要具有依赖于该类型(或最好是接口)的[ImportingConstructor]
属性的构造函数,或者该类型的属性具有[Import]
属性。
通过使用[Export]
属性修饰类,并确保将程序集添加到AggregateCatalog
,确保导出了类型。
希望这会有所帮助;)