Question

J'ai cette application avec CAL. Tous les modules proviennent d'une classe spéciale, ModuleBase , qui a une méthode abstraite, disons ApplySecurity , implémentée dans chacun d'entre eux.

OK, je charge les modules dans le bootstrapper. Après avoir appelé bootstrapper.Run () , je souhaite accéder à tous les modules chargés et appeler ce ApplySecurity . méthode.

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 cela crée de nouvelles instances de modules et je souhaite référencer ceux qui ont déjà été initialisés.

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

Teodor.

Était-ce utile?

La solution

Il semble que le problème réside dans le fait que lorsque le module est enregistré dans le conteneur, il ne l'est pas en tant qu'instance spécifique. Par conséquent, lorsque vous demandez la résolution, une nouvelle instance est créée. J'ai parcouru le code source de la licence d'accès client et l'enregistrement s'est déroulé au milieu d'un ensemble compliqué d'appels de méthode. Je doute donc que vous puissiez fournir votre propre implémentation de manière judicieuse.

Cela signifie que vous devrez enregistrer l’instance de votre module ailleurs. Pour ce faire, vous devez créer une sorte de catalogue d'instances de modules et ajouter un appel à chacune des méthodes initilize du module pour vous inscrire.

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 chaque module, Initilize ():

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

Ensuite, remplacez le code de votre question par:

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 très heureux avec cela car cela ressemble à un fudge, mais cela devrait marcher pour ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top