Настройка MEF - PullRequest
       8

Настройка MEF

2 голосов
/ 09 июля 2010

У меня есть ситуация, когда я хочу использовать MEF в шахматном проекте, над которым я работаю.Допустим, у меня есть конструктор класса, как в:

public class MoveManager
{
   private Piece _piece;

   public MoveManager(Piece piece)
   {
      _piece = piece;
   }
   Mode code here...
}

В этом контексте у меня будет несколько классов, которые будут производными от Piece, как, Pawn, Rook и т. Д. Если я добавлю атрибуты экспорта для всехнаследуется от Piece, объект, передаваемый в конструктор, имеет значение null.MEF перебирает все классы, имеющие [Export(typeof(Piece))], и если он превышает 1, он принимает значение NULL.Поэтому я не могу использовать MEF таким образом.Я собираюсь использовать Abstact Factory для получения правильной части.Похоже, что часть DI MEF может принять только один класс, который имеет [Export(typeof(some base class))].

Может ли кто-нибудь пролить свет на это?

1 Ответ

2 голосов
/ 22 октября 2015

Я думаю, что вы можете искать [Importing Constructor] arrtibute, который говорит MEF, как использовать конструктор экспортированного класса.

[Export(typeof(IPiece))]
class Pawn : IPiece
{
    [ImportingConstructor]
    public Pawn(ISomeDependency dep, [ImportMany] IEnumerable<IOtherDependency> depList)
    {
        //... do stuff with dependencies
    }
 }

Для этого требуется, чтобы ISomeDependency был экспортирован в другое место (ровно один раз)и принимает любое количество IOtherDependency, которые также могут быть экспортированы.

Предположим, что вы делали это с каждой частью, тогда вы могли бы:

[Export(typeof(IPieceList))]
class PieceList : IPieceList
{
    [ImportingConstructor]
    public PieceList([ImportMany] IEnumerable<IPiece> pieces)
    {
        // pieces now contains one of each piece that was exported above
    }
}
...