【问题标题】:Adding custom container to MEF将自定义容器添加到 MEF
【发布时间】:2011-08-31 07:40:27
【问题描述】:

我有以下使用 MEF 的案例。

我通过许多模块构建我的解决方案,每个模块都存在于不同的 dll 中。我使用 MEF 作为组合我所有项目的选择。 它工作正常,但有时我为一个模块添加一个服务类(AppService),这个类只是具有处理这个特定模块的通用服务的自定义静态方法。现在在这种方法中,我需要一些已经在 MEF 中组成的服务。 MEF 容器已经存在于邮件外壳程序中。 如何获得参考我需要的参考。如果我使用 [Import] 它不起作用。 示例:

public class AppService
{
  [Import]
  public IService MyService {get;set;}

  public static int Calc()
  {
      return MyService.Calc();   //My service is null
  }
} 

提前致谢...

【问题讨论】:

    标签: prism mef


    【解决方案1】:

    我认为您的代码确实存在一些问题。

    1.您确认您的AppService 类型正在组合吗?因为你不是[Export]-ing 它,所以我看不到它是如何生成的。如果您没有从容器中获取AppService 的实例,则必须手动满足导入:

    var service = new AppService();
    container.ComposeParts(service);
    

    2.您的类设计有一个static 方法,您试图在其中访问instance 属性。我假设您出于以下两个原因之一尝试这样做。要么,您假设 IServiceinterface 支持静态操作(它们不能),或者您正在调用支持 IService 类型的扩展方法,因为可疑扩展方法的第一个参数而失败为空:

    public static int Calc(this IService service) 
    {
        return service.Calc(); // failing perhaps?
    }
    

    如果是后一种扩展方法场景,它会建议类似于 1) 的内容,您需要确认您的 AppService 类型在实例化后正在组合。

    您有一个尝试访问instance 属性的static 方法这一事实告诉我,您可能需要重新考虑您的设计,并删除static 修饰符:

    public int Calc()
    {
        return MyService.Calc();
    }
    

    但同样,您的财产是公开的,那么这种方法有什么用处吗? 您当前的示例甚至不应该编译,因为您正试图从静态方法访问实例属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2016-06-15
      相关资源
      最近更新 更多