MEF允许您通过使用ImportMany
属性导入多个零件.它如何确定检索相关导出的顺序并将它们添加到您正在填充的可枚举中?例如,如何导入必须以特定顺序触发的多个IRules?我能想到的唯一方法是在IRule中使用OrderValue属性并手动排序:
public class Engine
{
[ImportMany]
public IEnumerable<IRule> Rules { get; set; }
public void Run()
{
// ...
// Initialise MEF
// ...
//
// Do I need to manually order Rules here?
//
foreach (IRule rule in Rules)
{
// Must execute in a specific order
rule.Execute();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Wes*_*ard 31
默认情况下,MEF不保证导入的导出的任何顺序.但是在MEF中,您可以使用一些元数据和自定义集合进行一些排序.例如,您可以执行以下操作:
public interface IRule { }
[Export(typeof(IRule))]
[ExportMetadata("Order", 1)]
public class Rule1 : IRule { }
[Export(typeof(IRule))]
[ExportMetadata("Order", 2)]
public class Rule2 : IRule { }
public interface IOrderMetadata
{
[DefaultValue(Int32.MaxValue)]
int Order { get; }
}
public class Engine
{
public Engine()
{
Rules = new OrderingCollection<IRule, IOrderMetadata>(
lazyRule => lazyRule.Metadata.Order);
}
[ImportMany]
public OrderingCollection<IRule, IOrderMetadata> Rules { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您将拥有一组按元数据排序的规则.您可以在http://codepaste.net/ktdgoh找到OrderingCollection示例.
归档时间: |
|
查看次数: |
4985 次 |
最近记录: |