Frage

Ich habe diese Anwendung mit CAL. Alle Module stammen aus einer speziellen Klasse, ModuleBase, die eine abstrakte Methode hat, sagt ApplySecurity in jedem von ihnen umgesetzt werden.

OK lade ich die Module in der Bootstrap-Programm, und nachdem ich bootstrapper.Run() nennen, möchte ich alle Module zugreifen, die diese ApplySecurity Methode wurden geladen und rufen.

Ich habe versucht, dies:

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

, aber das macht neue Instanzen von Modulen, und ich möchte die, die verweisen, die bereits initialisiert wurden.

Ich hoffe, dass ich klar genug gewesen sein,

Teodor.

War es hilfreich?

Lösung

Es sieht aus wie das Problem ist, dass, wenn das Modul in die Behälter eingetragen wird es nicht als eine bestimmte Instanz registriert ist, so dass, wenn Sie die eine neue Instanz erstellt wird, lösen fordern. Ich habe einen Blick durch die CAL-Quellcode hatte und die Registrierung geschieht in der Mitte eines gewundenen Satz von Methodenaufrufen, so bezweifle ich, Sie werden vernünftig Lage sein, eine eigene Implementierung zu liefern.

Das heißt, Sie müssen die Instanz des Moduls woanders registrieren. Die Art und Weise dies die Spitze von meinem Kopf zu tun, ist eine Art von Modulinstanz Katalog erstellen und einen Aufruf an jeden der Modul initilize Methode hinzufügen, mit ihm zu registrieren.

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

In Ihrem Bootstrapper CreateShell ():

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

In jedem Modul des initilize ():

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

Dann den Code in Ihrer Frage ersetzen mit:

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

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

Ich bin nicht allzu glücklich damit, wie es ein bisschen wie ein Fudge fühlt, aber es sollte für Arbeit, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top