我刚刚进入MEF并且想知道如何定义使用[ImportMany]导出的集合的顺序?
我的意思是,如果我有两个实现接口IService的类(Class1,Class2),并且每个实现都在两个不同的库中(尽管它们可以在同一个中),我希望Class2实例是在ImportMany属性定义的IEnumerable集合中的Class1实例之前创建。所以它就像一个功能管道,在Class1调用之前进行Class2调用。
另外,我在另一个库中有另一个类(Class3也实现了IService),我想稍后介绍(即一些日志实用程序),如何将它作为ImportMany集合中的第三个实例?
答案 0 :(得分:4)
从MEF的角度来看,我认为你是从错误的角度来解决这个问题。 MEF鼓励界面和实现之间的分离。为了让消费者决定实现的顺序,它迫使它理解实现。
Visual Studio采用的方法略有不同。它使用OrderAttribute,通常与NameAttribute结合使用,让实现者指定一个订单。然后,消费者可以使用名称和顺序的组合对ImportMany
的实现者进行排序,而无需了解底层实现。
答案 1 :(得分:1)
你可以'懒惰'首先加载它们,然后在将它们添加到集合时检查订单属性。
或者查看this answer,其中包含了您正在尝试做的事情的示例。