1

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

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

鉴于...

  • 以上所有项目都引用了 Shared 项目。
  • 服务器是启动应用程序,它将所有目录初始化到一个应用程序容器中。

MySettings...我可以启动一个应用程序并MyLogger在我的应用程序中初始化一个单例Server。到目前为止,一切都很好。

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

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

如何使用 MEFMySettings从内部正确访问单例?MyLogger

4

1 回答 1

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)
    {
    }
 }
于 2016-02-21T09:05:57.903 回答