Domanda

ho creato la mia architettura a plugin per uno dei miei programmi.

Fondamentalmente Plugin è la classe base per tutti i miei plugin e dire che ho plugin come PluginA: Plugin, PluginB:. Plugin

public class Plugin 
{
    private static Plugin _instance;
    public static Plugin Instance { get { return Plugin._instance; } }
}

Ora, come al solito ciascuno dei miei plugin hanno altre cose come forme e altre classi. Da che le classi voglio accedere all'istanza plug-in corrente simili;

Plugin.Instance.Settings()

Se faccio campo _instance assegnare a plug ctor simili;

public Plugin(GlobalSettings gs, PluginSettings ps)
{
    Plugin._instance=this;
}

Poi per ogni caricata plug l'istanza viene sovrascritto e ottengo risultati strani come PluginB.Instance restituire un'istanza di PluginA.

Lo so Singleton non sembra il modo giusto per fare questo, ma non è stato in grado di venire con un'altra soluzione. Forse un multiton può risolvere questo, ma io non voglio che i miei scrittori di plugin per andare per

Plugin.Instance["PluginB"] 

tutti i tempi, che sembra irrilevante.

Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Come suggerito, è necessario memorizzare questi in un elenco di qualche tipo, possibilmente nella domanda di hosting o, eventualmente, nella libreria.

È già un riferimento al plugin corrente, con il 'questo' parola chiave, semplicemente passare questo nelle vostre altre classi tramite costruttore o metodi:

come

public class MyPlugin :Plugin
{
    private MyClass myClass;

    public MyPlugin()
    {
         this.myClass = new MyClass(this);  
         this.myClass.DoSomething();
    }
    public void Something()
    {
         //Called back into from MyClass

    }
}
public class Myclass
{
     public Plugin OwnerPlugin {get;internal set;}
     public MyClass(Plugin ownerPlugin)
     {
           this.OwnerPlugin = ownerPlugin;
     }
     public void DoSomething()
     {
          //do something with ownerplugin
          this.OwnerPlugin.Something();
     } 
}

Altri suggerimenti

Rimuovi la parola static e mantenere un List<Plugin> ad anello su di loro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top