如何设置正确的MEF配置?

时间:2012-10-19 16:38:31

标签: c# .net-4.0 mef

我有一个名为IConfiguration的类的类库,它只是一个属性的接口。

我有一个名为TexasConfiguration的类库,它实现了IConfiguration,另一个名为FloridaConfiguration的类库实现了IConfiguration

我使用TexasConfiguration

修饰了FloridaConfiguration[Export(typeof(IConfiguration)]

我有另一个类,它是一个名为ConfigurationSystem的密封类,它包含一个定义为private ConfigurationSystem() {}的私有构造函数

我遇到的问题很少。一般来说,我应该把MEF的东西放在哪里设置它。目前,我已在ConfigurationSystem中添加了静态方法以及以下声明:

[Import(typeof(IConfiguration)]
IConfiguration configuration {get; set;}

在上面,它告诉我configuration未使用。在这种情况下这是正常的吗?

我还在ConfigurationSystem中创建了一个静态方法,但如果我将其设为静态,我无法将this传递给它,我必须将typeof(ConfigurationSystem)传递给它:

public static void SetupConfiguration()
    {
        using (DirectoryCatalog catalog = new DirectoryCatalog(@"c:\\developement\source\configuration"))
        {
            CompositionContainer container = new CompositionContainer(catalog);
            container.ComposeParts(typeof(ConfigurationSystem));
        }
    }

我希望能够做到这样的事情:

ConfigurationSystem.SetupConfiguration();

但除非声明方法是静态的,否则我不能这样做。简而言之,当应用程序启动时,它会调用静态方法Initialize,我想调用SetupConfiguration并将相应的配置对象分配给IConfiguration

1 个答案:

答案 0 :(得分:1)

MEF旨在使用对象实例,而不是静态类。对container.ComposeParts(typeof(ConfigurationSystem))的调用绝对没有任何意义,因为你在这里基本上要求MEF为你传递给它的Type对象组成部分,这显然不是你想要的。 / p>

虽然有一个简单的解决方案,但不会导致您过多地更改应用程序的体系结构。您可以将ConfigurationSystem课程设为单身,然后您就可以致电container.ComposeParts(this)并获取您的部分。