Cal에서는 모듈 인스턴스에 대한 참조를 어떻게 얻을 수 있습니까?
-
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();
});
나는 약간의 퍼지처럼 느껴지기 때문에 이것에 지나치게 만족하지는 않지만, 당신이 원하는 것에 효과가 있어야합니다.
제휴하지 않습니다 StackOverflow