2016-02-19 26 views
1

让我解释一下我需要的一个非常简单的例子。假设我有一个使用MEF的VS解决方案,并且具有以下广泛的项目和类结构。如何在我的解决方案中使用相同的CompositionConainer对象(或包含的组件)?

  1. 服务器(项目)
    • Server.cs(包含Main方法,用于启动该应用程序。)
  2. 共享(项目)
    • \合同
      • ILogger.cs
      • ISettings.cs
  3. 设置(项目)
    • MySettings.cs(类实施ISettings)
  4. 记录器(项目
    • MyLogger.cs(类实施ILogger)

鉴于...

  • 上述所有项目的引用共享项目。
  • 服务器是启动应用程序,它将所有目录初始化为应用程序容器。

...我可以启动一个应用程序,并从我Server应用程序中初始化的MySettingsMyLogger单身。到现在为止还挺好。

现在,我们假设MyLogger需要访问输出目录的设置文件。目录位置的值存储在MySettings对象中,该对象在Server.cs中初始化为CompositonContainer

由于我使用的是MEF,因此我不想在Logger项目中参考Settings项目。相反,我想使用MEF获取当前应用程序ISettings singleton,该应用程序在我的Server应用程序的开始处初始化,并且与服务器CompositionContainer一起存在。

如何使用MEF正确访问MyLogger内的MySettings单身人士?

回答

1

服务器:

class Services 
{ 
    [Import] 
    public ISettings Settings 
    { 
     get; set; 
    } 

    [Import] 
    public ILogger Logger 
    { 
     get; set; 
    } 

} 


static void Main() 
{ 
    AggregateCatalog catalog = new AggregateCatalog(); 
    catalog.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(SettingsProject.MySettings)); 
    catalog.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(LoggerProject.MyLogger)); 


    Services services = new Services(); 

    CompositionContainer cc = new CompositionContainer(catalog); 
    cc.ComposeParts(services); 

    // services properties are initialized   

} 

设置项目

[Export(typeof(ISettings)] 
class MySettings 
{ 
} 

记录仪项目

[Export(typeof(ILogger)] 
class MyLogger : ILogger 
{ 
    [ImportingConstructor] 
    public MyLogger(ISettings settings) 
    { 
    } 
} 
+0

Thabk您的回答!当我周一回到我的办公室时,我会验证这一点。这似乎是解决方案。 – RLH

相关问题