Я создал каталог сборки:Как управлять обнаружением и составом в качестве двух отдельных проблем?
private CompositionContainer GetContainer() {
// initialize directory info
ExtensionDirectory = new DirectoryInfo(settings.ExtensionsPath);
// directory catalog
var dirCatalog = new DirectoryCatalog(ExtensionDirectory.FullName);
return new CompositionContainer(dirCatalog);
}
Содержимое контейнера будет загружать все сборки в каталоге, как и ожидались. Я вообще не хочу ничего сочинять, потому что у меня есть конструкторы, которым будут вводиться зависимости.
Что я хочу сделать, это использовать AssemblyCatalog
в качестве репозитория; запрос для конкретного экспорта, передать зависимость конструктора, а затем составить только частей, участвующих в этом процессе.
Из того, что я понимаю, если бы я должен был назвать
_container.ComposeParts(this);
... без предоставления экспорта для [ImportingConstructor]
с, то ни одна из частей не будут включены в _container
.
Для облегчения запросов к контейнеру, у меня есть метод следующим образом:
public Lazy<IEntity> GetPart(Func<Lazy<IEntity, IEntityMetaData>, bool> selector) {
var entity = _container.GetExports<IEntity, IEntityMetaData>()
.Where(selector)
.Select(e => e as Lazy<IEntity>)
.FirstOrDefault();
return entity; // this will be passed up to the composition service
}
Кажется, что GetExports<T, M>()
не будет возвращать экспорт, содержащий [ImportingConstructor]
, если та часть, которая удовлетворяла бы зависимость не входит в контейнере.
Мой подход состоит в том, чтобы иметь контейнер/каталог расширения на низком уровне; служба композиции более высокого уровня получит все части и составит конечный объект. Я решил использовать этот подход, чтобы мы могли добавлять/расширять типы каталогов, доступных в будущем.
Да, они разделены - возможно, лучший термин был бы независимым. У нас есть каталоги, которые будут дополнениями к сервису композиции. Запрос службы для объекта и полностью скомпонованного объекта будет возвращен. – IAbstract
Я думаю, что собираюсь изучить модель конвенции MEF. Я думаю, что он предложит больше гибкости в том, как я хочу, чтобы обнаруженные части были обнаружены. – IAbstract
На самом деле, я только что нашел ваш блог: http://mindinthewater.blogspot.com/2011/03/mef-attribute-less-registration.html – IAbstract