看起来问题在于,当模块注册到容器时,它没有注册为特定实例,因此当您请求解析时,会创建一个新实例。我查看了 CAL 源代码,注册发生在一组复杂的方法调用的中间,所以我怀疑你是否能够明智地提供自己的实现。
这意味着您需要在其他地方注册模块的实例。我想到的方法是创建某种模块实例目录并添加对每个模块的 initilize 方法的调用以向它注册。
public class ModuleInstanceCatalog : IModuleInstanceCatalog
{
private Dictionary<Type, ModuleBase> _modules = new Dictionary<Type, ModuleBase>();
public void RegisterModuleInstance(ModuleBase module)
{
_modules.Add(module.GetType(), module);
}
public ModuleBase GetModuleInstanceByType(Type type)
{
return _modules[type];
}
}
在您的引导程序 CreateShell() 中:
this.Container.RegisterInstance<IModuleInstanceCatalog>(new ModuleInstanceCatalog());
在每个模块的 Initilize() 中:
IModuleInstanceCatalog catalog = this.Container.Resolve<IModuleInstanceCatalog>();
catalog.RegisterModuleInstance(this);
然后将问题中的代码替换为:
IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>();
IModuleInstanceCatalog instanceCatalog = this.Container.Resolve<IModuleInstanceCatalog>();
moduleCatalog.Modules.ToList().ForEach(m =>
{
instanceCatalog.GetModuleInstanceByType(m.ModuleType).ApplySecurity();
});
我对此并不太满意,因为它感觉有点像软糖,但它应该可以满足您的需求。