2009-06-19 71 views
0

我有这个应用程序使用CAL。 所有的模块都来自一个特殊的类ModuleBase,它有一个抽象方法,比如说在每个模块中都实现了ApplySecurity在CAL中,如何获取对模块实例的引用?

好的我在自举程序中加载模块,在我打电话给bootstrapper.Run()后,我想访问所有加载的模块并调用这个ApplySecurity方法。

我尝试这样做:

IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>(); 

moduleCatalog.Modules.ToList().ForEach(m => 
{ 
    (this.Container.Resolve(Type.GetType(m.ModuleType, false, false)) 
     as ModuleBase).ApplySecurity(); //^^^ this is making new instances!! 
}); 

但是这使得模块的新实例,我想引用已经初始化的人。

我希望我已经清楚,

Teodor。

回答

0

看起来问题是,当模块注册到容器时,它没有注册为特定实例,因此当您请求解析时会创建一个新实例。我查看了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()); 

在每个模块中的用来初始化():

IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>(); 
IModuleInstanceCatalog instanceCatalog = this.Container.Resolve<IModuleInstanceCatalog>(); 

moduleCatalog.Modules.ToList().ForEach(m => 
{ 
    instanceCatalog.GetModuleInstanceByType(m.ModuleType).ApplySecurity(); 
}); 

IModuleInstanceCatalog catalog = this.Container.Resolve<IModuleInstanceCatalog>(); 
catalog.RegisterModuleInstance(this); 

然后替换代码在你的问题

我不太满意th就像它有点模糊,但它应该适合你想要的东西。

+0

谢谢你的回答,这是做的工作。 :) – Teodor 2009-06-19 13:33:48

相关问题