2009-06-19 2 views
0

J'ai cette application en utilisant CAL. Tous les modules dérivent d'une classe spéciale, ModuleBase, qui a une méthode abstraite, disons ApplySecurity implémentée dans chacun d'entre eux.En CAL, comment puis-je obtenir une référence à une instance de module?

OK Je charge les modules dans le programme d'amorçage et après avoir appelé bootstrapper.Run(), je souhaite accéder à tous les modules qui ont été chargés et appeler cette méthode ApplySecurity.

J'ai essayé ceci:

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

mais ce fait de nouvelles instances de modules, et je veux faire référence à ceux qui ont déjà été initialisés.

J'espère avoir été assez clair,

Teodor.

Répondre

0

Il semble que le problème est que lorsque le module est enregistré dans le conteneur, il n'est pas enregistré en tant qu'instance spécifique. Lorsque vous demandez la résolution, une nouvelle instance est créée. J'ai jeté un coup d'oeil à travers le code source CAL et l'enregistrement se passe au milieu d'un ensemble alambiqué d'appels de méthode, donc je doute que vous serez en mesure de fournir raisonnablement votre propre implémentation. Cela signifie que vous devrez enregistrer l'instance de votre module à un autre emplacement. Pour ce faire, je crée un catalogue d'instance de module et j'ajoute un appel à la méthode initilize du module pour l'enregistrer.

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

Dans votre Bootstrapper CreateShell():

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

Dans Initilize() de chaque module:

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

remplacer ensuite le code dans votre question:

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

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

Je ne suis pas trop heureux avec C'est comme si c'était un peu fudge, mais ça devrait marcher pour ce que vous voulez.

+0

Merci pour votre réponse, cela a fait le travail. :) – Teodor

Questions connexes