将自定义容器添加到MEF

时间:2011-08-31 07:40:27

标签: prism mef

我有以下使用MEF的情况。

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

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

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

提前致谢...

1 个答案:

答案 0 :(得分:2)

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

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

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

2.您的班级设计有static方法,您尝试访问instance属性。我假设你是出于两个原因之一而尝试这种方法。或者,您假设interface IService支持静态操作(他们不能),或者您正在调用支持IService类型的扩展方法,因为第一个类型失败可疑扩展方法的参数为null:

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

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

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

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

但同样,你的财产是公开的,这种方法是否可以使用? 您当前的示例甚至不应该编译,因为您尝试从静态方法访问实例属性。