我正在将我的一些代码转换为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); } }
}
请告诉我这种情况是否可行,或者我是否必须在此实例中重构我的服务界面。
答案 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; }
}