0

私はCALを使用してこのアプリケーションを持っています。すべてのモジュールは、それぞれに実装されModuleBaseているような抽象メソッドを持つ特別なクラスから派生しています。ApplySecurity

OKブートストラッパーにモジュールをロードし、呼び出した後、ロードされたすべてのモジュールにアクセスして、このメソッド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!!
});

しかし、これはモジュールの新しいインスタンスを作成しているので、すでに初期化されているものを参照したいと思います。

私は十分に明確になっているといいのですが、

テオドール。

4

1 に答える 1

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];
     }
}

Bootstrapper 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();
});

少しごちゃごちゃしているように感じるので、これにはあまり満足していませんが、あなたが望むものにはうまくいくはずです.

于 2009-06-19T12:45:24.593 に答える