Pergunta

Eu tenho esse aplicativo usando CAL. Todos os módulos de derivar de uma classe especial, ModuleBase, que tem um método abstrato, dizem ApplySecurity implementado em cada um deles.

OK eu carregar os módulos no bootstrapper, e depois que eu chamo bootstrapper.Run(), eu quero acessar todos os módulos que foram carregados e chamar esse método ApplySecurity.

Eu tentei isso:

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!!
});

mas isso está fazendo novas instâncias de módulos, e eu quero fazer referência os que já foram inicializados.

Espero ter sido claro o suficiente,

Teodor.

Foi útil?

Solução

Parece que o problema é que quando o módulo está registrado para o recipiente que não está registrado como uma instância específica, então quando você solicitar a determinação de uma nova instância é criada. Eu tive um olhar através do código fonte CAL eo registro acontece no meio de um conjunto complicado de chamadas de método, então eu duvido que você vai ser capaz de fornecer de forma sensata sua própria implementação.

Isto significa que você precisa de registar a instância do seu módulo em outro lugar. A maneira de fazer isso em cima da minha cabeça é criar algum tipo de catálogo instância módulo e adicione uma chamada para cada um método initilize do módulo para registrar com ele.

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

Em seu Bootstrapper CreateShell ():

this.Container.RegisterInstance<IModuleInstanceCatalog>(new ModuleInstanceCatalog());

Em initilize de cada módulo ():

IModuleInstanceCatalog catalog = this.Container.Resolve<IModuleInstanceCatalog>();
catalog.RegisterModuleInstance(this);

Em seguida, substitua o código na sua pergunta com:

IModuleCatalog moduleCatalog = this.Container.Resolve<IModuleCatalog>();
IModuleInstanceCatalog instanceCatalog = this.Container.Resolve<IModuleInstanceCatalog>();

moduleCatalog.Modules.ToList().ForEach(m => 
{
    instanceCatalog.GetModuleInstanceByType(m.ModuleType).ApplySecurity();
});

Eu não sou demasiado feliz com isso como se sente um pouco de fudge, mas ele deve trabalhar para o que você quer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top