2011-06-19 27 views
1
[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>会让我通过一些参数,但它不会。那么,是否有某种模式可以解释我希望实现的目标?MEF - 任何方式用参数初始化它?

只是做一个新的()不会削减它,因为MyBarService保持为null。我想过删除ExportAttribute并使用ComponentInitializer.SatisfyImports(this),这让我使用new(),但这样做使得我必须new()所有东西。我有点希望有一个两全其美的世界......有某种方式来导入某些参数。这样我仍然是解耦的,但能够通过设置参数生成我的ViewModel的实例。

回答

0

MEF支持depedency注射,例如,我可以这样做:

[ImportingConstructor] 
public MyViewModel(Foo foo) 
{ 

} 

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

+0

不需要。除非Foo使用ExportAttribute标记,否则这将不起作用,此时我可以使用ImportAttribute标记该字段。 – michael

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

+0

这工作,但可能会导致问题:如果它是公共readonly int SomeNumber;'... Initialize将无法设置它,而构造函数会。 –