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——有什么方法可以用参数初始化它吗

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方法。