c # - Implementazione plug proprietà di istanza per il codice di ambito interno
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.
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.