MEF——有什么方法可以用参数初始化它吗
本文关键字:参数 初始化 什么 方法 MEF | 更新日期: 2023-09-27 17:59:26
[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>
可能会让我传入一些参数,但它没有。那么,有没有某种模式可以解释我希望实现的目标?
简单地做一个new((并不能剪切它,因为MyBarService
在那时保持为null。我曾考虑过删除ExportAttribute
并使用ComponentInitializer.SatisfyImports(this)
,让我使用new((,但这有点像,所以我必须对所有内容进行new((。我有点希望两全其美。。。有某种类型的方法来导入带有参数的东西。这样,我仍然是解耦的,但能够使用参数集生成ViewModel的实例。
MEF支持depedency注入,例如,我可以做:
[ImportingConstructor]
public MyViewModel(Foo foo)
{
}
MEF会自动尝试将Foo
的一个实例注入到我的构造函数中。也许您可以使用此机制将所需的服务注入到组成的部分中?
如果您想将一些参数从导入器传递给导出器,那么您可以在要导出的类或接口上放置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
方法。