如何在我的解决方案中使用相同的CompositionConainer对象(或它包含的程序集)?

时间:2016-02-19 20:33:50

标签: c# dependency-injection mef system.componentmodel

让我解释一下我需要的一个非常简单的例子。让我们说我有一个使用MEF的VS解决方案,并且具有以下广泛的项目和类结构。

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

    • 以上所有项目均引用共享项目。
    • Server是启动应用程序,它将所有目录初始化为应用程序容器。

    ...我可以启动一个应用程序,并在我的MySettings应用程序中初始化MyLoggerServer的单例。到目前为止,非常好。

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

    由于我使用MEF,我不想在Settings项目中引用Logger项目。相反,我想使用MEF来获取当前应用程序ISettings单例,它在我的Server应用程序开始时初始化,并且存在服务器CompositionContainer

    如何使用MEF从MySettings内正确访问MyLogger单身?

1 个答案:

答案 0 :(得分: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)
    {
    }
 }