Я настроил каталог сборок:
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]
s, то ни одна из частей не была бы включена в _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]
, есличасть, которая удовлетворяла бы зависимости, не включена в контейнер.
Мой подход состоит в том, чтобы иметь контейнер / каталог расширения на низком уровне;Служба композиции более высокого уровня получит все части и создаст конечный объект.Я выбрал этот подход, чтобы мы могли добавлять / расширять типы каталогов, доступных в будущем.