【问题标题】:How to define the order with ImportMany attribute?如何使用 ImportMany 属性定义订单?
【发布时间】:2011-02-28 18:12:08
【问题描述】:

我刚刚进入 MEF,想知道如何定义使用 [ImportMany] 导出的集合的顺序?

我的意思是,如果我有两个实现接口 IService 的类(Class1、Class2)并且每个实现都在两个不同的库中(尽管它们可能在同一个库中),我希望 Class2 实例是在由 ImportMany 属性定义的 IEnumerable 集合中的 Class1 实例之前创建。所以它就像一个功能管道,其中 Class2 调用在 Class1 调用之前进行。

另外,我在另一个库中有另一个类(也实现了 IService 的 Class3),我想稍后介绍它(即一些日志记录实用程序),我如何使它成为 ImportMany 集合中的第三个实例?

【问题讨论】:

    标签: .net mef


    【解决方案1】:

    您可以先“延迟”加载它们,然后在将它们添加到集合时检查订单属性。

    或者查看this answer,它有一个你正在尝试做什么的例子。

    【讨论】:

    • 谢谢蒂姆。我仍在掌握 MEF。
    【解决方案2】:

    从 MEF 的角度来看,我认为您从错误的角度处理这个问题。 MEF 鼓励接口和实现之间的分离。为了让消费者决定实现的顺序,它迫使它理解实现。

    Visual Studio 采用的方法有点不同。它使用OrderAttribute,通常与NameAttribute 结合使用,让实现者指定一个顺序。然后,消费者可以使用名称和顺序的组合对ImportMany 的实现者进行排序,而无需了解底层实现。

    【讨论】:

    • 感谢您的回复。仍然有点困惑,就客户而言,他将拥有一个 IService[] 的集合,我将其视为功能管道(我们在这里仍然将接口和实现分开)。消费者/客户端不指定顺序,它是可用的以及它们在 IService[] 集合中的顺序。现在,如果我们想要一个服务在另一个服务之前运行(在管道中),我们该怎么做?抱歉,如果我不明白你的回答(因为我显然没有)
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多