【问题标题】:MEF ConfigurationMEF 配置
【发布时间】:2012-07-20 19:12:29
【问题描述】:

是否有任何 MEF 的配置文件设置,或者一切都在代码中完成?

如果一切都在代码中,那么在进行导出的不同类之间切换的最佳做法是什么?即,如果 A 类和 B 类都导出 IMyExport,那么有哪些好方法可以“配置”应用程序以使用 A 或使用 B?

【问题讨论】:

    标签: c# c#-4.0 mef


    【解决方案1】:

    据我所知,MEF 没有配置文件。如果您希望您的应用程序使用一个实现而不是另一个实现,您可能会创建一个新的ConfigurationCatalog,它将获取一个配置文件作为输入,并且只会导出它告诉它的部分。 MefContrib 中可能已经存在类似的东西,所以我会在那里检查。

    除此之外,由类自己决定他们想使用哪个实现。实现您想要的一种可能方法是使用合同名称

    [Export("My Contract Name", typeof(IMyExport))]
    public class A : IMyExport { }
    
    [Export("Another Contract Name", typeof(IMyExport))]
    public class B : IMyExport { }
    

    那么导入IMyExport的类就可以指定要使用哪个部分了

    [Import("Another Contract Name")]
    public IMyExport MyExport { get; set; }
    

    如果您知道某个依赖项IMyExport 可以多次导出,您可以add metadata to the export 并在运行时根据其元数据决定您要使用哪个导出。如果你按照这个方向去做,你的代码会是这样的

    [MySpecialExport(SomeData = "ABC")]
    public class A : IMyExport { }
    
    [MySpecialExport(SomeData = "DEF")]
    public class B : IMyExport { }
    
    public class MyClass
    {
        [ImportMany(typeof(IMyExport))]
        public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; }
    
        public void DoSomething()
        {
            var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF");
            IMyExport myExport = myLazyExport.Value;
    
            // Do something with myExport
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多