Использование [ImportingConstructor] для импорта вызывающего объекта в параметр конструктора с использованием MEF - PullRequest
1 голос
/ 19 августа 2010

Я в процессе преобразования своего кода в 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 ]

1 голос
/ 20 августа 2010

Если вы можете изменить один из импортов в циклической цепочке зависимостей на ленивый, он должен работать. Например:

[Import] 
public Lazy<IAccountServerService> { get; set; } 
0 голосов
/ 19 августа 2010

Таким образом, MEF поддерживает циклические зависимости, но оба они должны быть импортом свойств, ни один из них не может быть импортом конструктора. Поэтому следующее должно работать с точки зрения MEF, конечно, я не уверен, что этот подход заблокирован каким-то другим ограничением, которое у вас есть.

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

    public AccountServerService () { ... }
}

public class Account {
    [Import]
    public IAccountServerService { get; set; }
}
0 голосов
/ 19 августа 2010

Я не уверен, что взаимовыгодные контракты возможны или не возможны в 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) {
      ...
   }
}
...