CALでは、モジュールインスタンスへの参照を取得するにはどうすればよいですか?
-
06-07-2019 - |
質問
CALを使用してこのアプリケーションを使用しています。
すべてのモジュールは、それぞれのクラスに実装された ApplySecurity
などの抽象メソッドを持つ特別なクラス ModuleBase
から派生します。
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!!
});
しかし、これはモジュールの新しいインスタンスを作成しているので、すでに初期化されたものを参照したいです。
十分に明確であることを願っています、
テオドール。
解決
問題は、モジュールがコンテナに登録されたときに特定のインスタンスとして登録されていないため、解決を要求すると新しいインスタンスが作成されるということです。 CALのソースコードを確認しましたが、登録は複雑なメソッド呼び出しの途中で行われるため、独自の実装を賢明に提供できるとは思いません。
これは、モジュールのインスタンスを別の場所に登録する必要があることを意味します。私の頭の中でこれを行う方法は、ある種のモジュールインスタンスカタログを作成し、モジュールの各初期化メソッドに呼び出しを追加して登録することです。
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();
});
少しファッジのように感じるので、これにはあまり満足していませんが、あなたが望むものにはうまくいくはずです。
所属していません StackOverflow