Cal에서는 모듈 인스턴스에 대한 참조를 어떻게 얻을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1017479

  •  06-07-2019
  •  | 
  •  

문제

Cal을 사용 하여이 응용 프로그램이 있습니다. 모든 모듈은 특별 수업에서 파생되며 ModuleBase, 추상적 인 방법이 있습니다 ApplySecurity 그들 각각에서 구현되었습니다.

좋아, 나는 부트 스트랩퍼에 모듈을로드하고 전화 후 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();
});

나는 약간의 퍼지처럼 느껴지기 때문에 이것에 지나치게 만족하지는 않지만, 당신이 원하는 것에 효과가 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top