問題は、モジュールがコンテナに登録されているときに特定のインスタンスとして登録されていないため、解決を要求すると新しいインスタンスが作成されることです。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();
});
少しごちゃごちゃしているように感じるので、これにはあまり満足していませんが、あなたが望むものにはうまくいくはずです.