使用MEF的简单插件。如何使用配置文件加载插件

时间:2010-08-05 04:45:10

标签: mef

我正在编写一个小插件架构,我决定使用MEF 有人告诉我,我们必须使用配置文件。

有没有使用Mef和配置文件的例子?

我需要的是如何在配置文件中设置mef这可能吗?这是我为测试它而构建的一个小的noddy示例我缺少loadPlugin函数和配置文件可以帮助

Noddy的例子

                       //MyCompany.Payment.Contracts.dll

        public interface IPayment
        {
            bool Pay();
        }
        //MyCompany.Payment.ServiceProviderOne.dll
          [Export(typeof(IPayment))]
        public class ServiceProviderOne:IPayment
        {
            public bool Pay(return true);
        }
        //MyCompany.Payment.ServiceProviderTwo.dll
          [Export(typeof(IPayment))]
        public class ServiceProviderTwo:IPayment
        {
            ?public bool Pay(return true);
        }

        //Main Console.Applicaiton
        class Program
            {
                static void Main(string[] args)
                {
                    HelperPlugin helperPlugin =new HelperPlugin();
                    List<IPayment> myLoadedPayments= helperPlugin.GetPlugins();

                    //blahhh conti
                }
            }

            public cass HelperPlugin
            {
                [ImportMany(typeof(IPayment))]
                public List<IPayment>Payments { get; set; }

                public List<IPayment>GetPlugins()
                {
                    Payments=new List<IPayment>();
                    LoadPlugins();

                    return Payments;
                }

                private void LoadPlugins()
                {
                 ???
                }
            }

配置文件它看起来像什么?

感谢您提出任何建议或代码段

2 个答案:

答案 0 :(得分:1)

我现在正在处理类似的问题,我的方法就是:

  • 我打算有一个配置文件来定义我的CompositionContainer将如何配置
  • 我的配置应该包含要扫描的容器的目录列表(对每个指定的目录使用DirectoryCatalog
  • 并且我的配置还应该支持可能存储在其他地方的程序集列表,并且可以通过为此目的使用多个AssemblyCatalog来包含该程序集

基本上,我正在尝试配置组成容器将用于查找部件的AggregateCatalog个别目录。不幸的是,现在还没有 - 所以现在这只是在我脑海中 - 还没有代码。

答案 1 :(得分:1)

我在最近的一个项目中所做的是在界面中包含一个Name属性。我想要访问的所有扩展都已加载,然后配置文件设置列出了我想要使用的名称。我使用循环检查已加载的扩展,如果在设置中命名,我将它们添加到内部列表中。

我的要求是有一个特定的订单,使用扩展,所以这个解决方案对我有用。

我可以在程序集中包含元数据来完成同样的事情,但希望信息更加明显并且是合同的一部分。