使用MEF导入对象时设置非注入参数

时间:2011-11-08 18:23:39

标签: silverlight-4.0 dependency-injection mef

我的Silverlight 4应用程序中有以下场景:

public class TheViewModel
{
    [Import()]
    public TheChild Child { get; set; }
}

[Export()]
public class TheChild
{
    [ImportingConstructor()]
    public TheChild(String myName, IAmTheService service) { ... }
}

[Export(typeof(IAmTheService))]
public class TheService : IAmTheService
{
    public void DoSomething(String theName);
}

如您所见,TheChild的构造函数需要一个导入的参数和一个上下文相关的静态值(必须由父级提供)。字符串值不能来自AppSettings,配置等,只能由父类的当前实例提供(在本例中为TheViewModel)。

作为一个经验法则,我总是按照以下方式接近依赖注入:

  1. 通过构造函数注入来满足所需的依赖项
  2. 通过属性注入满足可选依赖项
  3. " myName"参数是必需的,所以我宁愿通过构造函数设置它,但考虑到MEF的工作方式,我意识到这可能需要改变。

    您能告诉我您是如何处理这种情况以及您对解决方案背后的想法吗?

1 个答案:

答案 0 :(得分:1)

您可以与[ImportingConstructor]一起指定特定的导入合同。例如:

[Export()]
public class TheChild
{
    [ImportingConstructor()]
    public TheChild([Import("MyName")] String myName, IAmTheService service) { ... }

鉴于此,将需要导出用[Export("MyName")]装饰的字符串并用于实现依赖性。任何[Import]规范都适用于这种情况(即:按类型导入子类,按名称导入等)。