使用[ImportingConstructor]使用MEF将调用对象导入构造函数参数

时间:2010-08-19 15:26:16

标签: dependency-injection mef constructor-injection

我正在将我的一些代码转换为MEF,这是一个与MEF完全相同的专有系统,我对如何解决我最近遇到的以下问题有疑问。< / p>

我有一个典型的实体对象,看起来像这样:

public class Account {

    [Import]
    public IAccountServerService { get; set; }
}

需要导入上述实体对象的服务对象:

public class AccountServerService : IAccountServerService {

    [ImportingConstructor]
    public AccountServerService (Account account) { ... }
}

要将其放入单词中,我需要将传递到account构造函数实例的AccountServerService参数作为调用Account对象的对象。所以它就像这样:

public class Account {

    public IAccountServerService { get { return new AccountServerService (this); } }
}

请告诉我这种情况是否可行,或者我是否必须在此实例中重构我的服务界面。

3 个答案:

答案 0 :(得分:1)

如果您可以将循环依赖关系链中的某个导入更改为延迟导入,则它应该可以正常工作。例如:

[Import] 
public Lazy<IAccountServerService> { get; set; } 

答案 1 :(得分:0)

我不确定MEF中是否存在相互递归的合同。我会在下面考虑一下,不需要相互递归的服务合同。

interface IAccountFactory {
  Account CreateAccount(IAccountServerService service);
}

[Export(typeof(IAccountFactory))]
sealed class AccountFactory {
  Account CreateAccount(IAccountServerService service) {
    return new Account(service);
  }
}

class Account {
   Account(IAccountServerService service) {
      ...
   }
}

答案 2 :(得分:0)

所以MEF确实支持循环依赖,但它们都必须是属性导入,它们都不能是构造函数导入。因此,以下应该从MEF的角度来看,当然我不确定这种方法是否被你的其他约束所阻挡。

public class AccountServerService : IAccountServerService {
    [Import]
    public Account Account { get; set; }

    public AccountServerService () { ... }
}

public class Account {
    [Import]
    public IAccountServerService { get; set; }
}