C # MEF не может делать привязку типов? - PullRequest
3 голосов
/ 24 февраля 2011

Я бы хотел связать по типу вместо объекта, который был создан.

Что я должен сделать сейчас:

var catalog = new AssemblyCatalog(typeof(...).Assembly);

var container = new CompositionContainer(catalog); 
    var batch = new CompositionBatch(); 
var mySamurai = new Samurai(); 
batch.AddPart(mySamurai);//I would prefer the type not an object...    
    container.Compose(batch);
mySamurai.Attack();

Это работает, но я хотел бы сделать что-то вроде:

var catalog = new AssemblyCatalog(typeof(...).Assembly);
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();

batch.AddPart(typeof(Samurai));//HERE container.Compose(batch);        
var mySamurai = new Samurai();
mySamurai.Attack(); 

Это возможно с MEF?

Ответы [ 3 ]

1 голос
/ 25 февраля 2011

Обычно вы настраиваете экспорт и импорт в MEF с атрибутами, а не настраиваете их в коде, как это делает Ninject.

Даже несмотря на то, что MEF не выполняет «настройку в коде» из коробки, вы все равно можетеиспользуйте проект MEFContrib , чтобы сделать это с провайдером экспорта фабрики .

update : в MEF2-Preview3 регистрация без атрибутов было добавлено.

Кроме того, Марк Сееманн написал в блоге о способе «регистрации» типов даже без использования новой регистрации без атрибутов, путем умного использования экспорта свойств и обобщений..

1 голос
/ 24 февраля 2011

Если я правильно вас понимаю, это невозможно сделать. MEF ничего не может сделать, когда видит fakeEntity2, потому что MEF на самом деле никогда его не «видит». Вы должны передать его в контейнер, как вы это делаете с fakeEntity, или вы должны экспортировать класс FakeEntity и каким-то образом извлечь его из контейнера (то есть с GetExportedValue).

0 голосов
/ 23 марта 2011

Я не знаю много о MEF, но ваша ситуация выглядит как что-то, что контейнер IoC, такой как Ninject, Unity, StuctureMap, Castle Windsor и др. ... преуспел бы.

...