代码之家  ›  专栏  ›  技术社区  ›  Nick Berardi

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

  •  1
  • Nick Berardi  · 技术社区  · 14 年前

    我正在将我的一些代码从一个专有系统转换成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); } }
    }
    

    请让我知道这个场景是否可行,或者我是否必须在这个实例中重构我的服务接口。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Wes Haggard    14 年前

    所以MEF确实支持循环依赖,但它们都必须是属性导入,两者都不能是构造函数导入。所以下面的内容应该从MEF的角度出发,当然我不确定这个方法是否被其他约束所阻止。

    public class AccountServerService : IAccountServerService {
        [Import]
        public Account Account { get; set; }
    
        public AccountServerService () { ... }
    }
    
    public class Account {
        [Import]
        public IAccountServerService { get; set; }
    }
    
        2
  •  1
  •   Daniel Plaisted    14 年前

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

    [Import] 
    public Lazy<IAccountServerService> { get; set; } 
    
        3
  •  0
  •   JaredPar    14 年前

    我不确定在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) {
          ...
       }
    }