2011-12-18 37 views
1

我得到一个ViewModel,我用MEF导出。我希望这个ViewModel每次被导入时都会被不同地初始化,根据提供给它的枚举/特定对象参数。导入一个具有特定参数的类

我一直在读了一点关于这个问题,我发现,也许这 -

http://msdn.microsoft.com/en-us/library/ee155691.aspx#metadata_and_metadata_views

将能够满足我的需要,但我不知道,这将是最好的方法来做到这一点。

另一种方法我一直在思考,通常导入类,然后一旦我一个实例,调用会收到我的参数一种特殊的初始化方法。然而,这看起来不像是一个典型的MEF实施,并且可能会损失一些“魔力”。

我希望有人能够指出我会推荐什么方法来实现这一点。

谢谢!

+0

而不是使用导出属性,我相信你可以在容器中存储一个工厂,每次请求虚拟机的实例时调用 – stijn 2011-12-18 09:47:08

+0

Hmm sound有趣的,但请你指点一下关于这个解决方案的一些信息?我怕我不知道我究竟是如何能实现这个解决方案。 – Dror 2011-12-18 09:56:35

回答

1

解决方法是导出创建类型实例的工厂。虽然这意味着你不能直接导入茨艾伦情况下,它确实有一个逻辑来创建它们的好处是厂家的责任,因此类的用户不必知道它:

public class ServiceWithParameter 
{ 
    public ServiceWithParameter(int a) 
    { 
    this.a = a; 
    } 

    private readonly int a; 
} 

[Export] 
public class ServiceWithParameterFactory 
{ 
    public ServiceWithParameterFactory() 
    { 
    instance = 0; 
    } 

    public ServiceWithParameter Instance() 
    { 
    return new ServiceWithParameter(instance++); 
    } 

    private int instance; 
} 

    //now everywhere you need ServiceWithParameter: 
[Import] 
ServiceWithParameterFactory serviceFactory; 

var instanceA = serviceFactory.Instance(); //instanceA.a = 0 
var instanceB = serviceFactory.Instance(); //instanceB.a = 1 

更扩展方式是告诉容器你有一个工厂,这里给出一个例子:http://pwlodek.blogspot.com/2010/10/mef-object-factories-using-export.html

相关问题