Несколько 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 и получает несколько других IModuleCatalogs и его реализация каким-то образом делегирует внутренние каталоги.

Наверное, проще клонировать 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;
}
Другие вопросы по тегам