MEF - 用参数初始化它的任何方法?

时间:2011-06-19 11:56:43

标签: c# parameters initialization export mef

[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实例。

2 个答案:

答案 0 :(得分:0)

MEF支持依赖注入,例如,我可以这样做:

[ImportingConstructor]
public MyViewModel(Foo foo)
{

}

MEF会自动尝试将Foo的实例注入我的构造函数中。也许你可以使用这种机制将所需的服务注入你的组成部分?

答案 1 :(得分:0)

如果要将某些参数从导入器传递到导出器,则可以在要导出的类或接口上放置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方法。