Несколько DirectoryModuleCatalog в приложении Prism
У нас есть приложения Unity+Prism WPF, и есть 2 папки, из которых мы хотим динамически загружать модули.
Я знаю, что для загрузки модулей из каталога, я должен использовать DirectoryModuleCatalog
, но CreateModuleCatalog
Метод позволяет возвращать только один каталог, так как мне обернуть их в один каталог?
В моем Boostrapper, что я должен вернуться сюда:
protected override IModuleCatalog CreateModuleCatalog()
{
new DirectoryModuleCatalog() { ModulePath = @".\Services" };
new DirectoryModuleCatalog() { ModulePath = @".\Packages" };
//Maybe some day another catalog, maybe not even a directory one.
return ???????;
}
Согласно @Haukinger, я должен разработать свой собственный каталог, поэтому я начал с этого:
public class AggregatedModuleCatalog : IModuleCatalog
{
private readonly List<IModuleCatalog> _catalogs;
private readonly ModuleCatalog _localModulesCatalog = new ModuleCatalog();
public IEnumerable<ModuleInfo> Modules => _catalogs.SelectMany(c => c.Modules).ToList();
public AggregatedModuleCatalog(IReadOnlyCollection<IModuleCatalog> catalogs)
{
if (catalogs == null)
{
throw new ArgumentNullException();
}
_catalogs = new List<IModuleCatalog>(_catalogs) {_localModulesCatalog};
}
public IEnumerable<ModuleInfo> GetDependentModules(ModuleInfo moduleInfo)
{
return _catalogs.SelectMany(c => c.GetDependentModules(moduleInfo)).Distinct().ToList();
}
public IEnumerable<ModuleInfo> CompleteListWithDependencies(IEnumerable<ModuleInfo> modules)
{
return _catalogs.SelectMany(c => c.CompleteListWithDependencies(modules)).Distinct().ToList();
}
public void Initialize()
{
_catalogs.ForEach(c => c.Initialize());
}
public void AddModule(ModuleInfo moduleInfo)
{
_localModulesCatalog.AddModule(moduleInfo);
}
}
2 ответа
Вам нужно написать AggregatingModuleCatalog
который реализует IModuleCatalog
и получает несколько других IModuleCatalog
s и его реализация каким-то образом делегирует внутренние каталоги.
Наверное, проще клонировать DirectoryModuleCatalog
и заставить его смотреть в нескольких каталогах. Старый SmartDirectoryModuleCatalog также может быть хорошей отправной точкой.
Приведенное ниже решение работает в Prism 8. Дайте мне знать, поможет ли оно вам.
protected override IModuleCatalog CreateModuleCatalog()
{
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var directories = new string[]{"Modules", "Services" };
List<IModuleCatalogItem> components = new List<IModuleCatalogItem>();
foreach (var dir in directories)
{
var dirCatelog = new DirectoryModuleCatalog() { ModulePath = $"{path}\\{dir}" };
dirCatelog.Initialize();
components.AddRange(dirCatelog.Items);
}
var catelog = new ModuleCatalog();
foreach (var com in components)
{
catelog.Items.Add(com);
}
return catelog;
}