2009-06-19 33 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

相關問題