问题
We have Unity+Prism WPF applications, and there is 2 folders from which we want to load dynamically the modules.
I know that to load modules from a directory, I should use a DirectoryModuleCatalog
, but the CreateModuleCatalog
method allows only one catalog to be returned, so how do I wrap them in one catalog?
In my boostrapper, what should I return here:
protected override IModuleCatalog CreateModuleCatalog()
{
new DirectoryModuleCatalog() { ModulePath = @".\Services" };
new DirectoryModuleCatalog() { ModulePath = @".\Packages" };
//Maybe some day another catalog, maybe not even a directory one.
return ???????;
}
According to @Haukinger, I should develop my own catalog, so I started with this:
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);
}
}
回答1:
You'd need to write an AggregatingModuleCatalog
that implements IModuleCatalog
and receives several other IModuleCatalog
s and its implementation somehow delegates to the inner catalogs.
Probably easier to clone the DirectoryModuleCatalog
and make it look in multiple directories. The old SmartDirectoryModuleCatalog might be a good starting point, too.
来源:https://stackoverflow.com/questions/48945795/multiple-directorymodulecatalog-in-a-prism-application