1

我正在将我的一些代码从一个与 MEF 做同样事情的专有系统转换为 MEF,我有一个关于如何完成我最近遇到的以下问题的问题。

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

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); } }
}

请让我知道这种情况是否可行,或者我是否必须在这种情况下重构我的服务接口。

4

3 回答 3

1

如果您可以将循环依赖链中的其中一个导入更改为惰性导入,它应该可以工作。例如:

[Import] 
public Lazy<IAccountServerService> { get; set; } 
于 2010-08-19T21:48:26.023 回答
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) {
      ...
   }
}
于 2010-08-19T15:32:41.830 回答
0

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

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

    public AccountServerService () { ... }
}

public class Account {
    [Import]
    public IAccountServerService { get; set; }
}
于 2010-08-19T19:05:11.623 回答