Pregunta

He creado mi propia arquitectura plug-in para uno de mis programas.

Básicamente Plugin es la clase base para todos mis plugins y decir que he plugins como PluginA: Plugin, PluginB:. Plugin

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

Ahora bien, como de costumbre cada una de mis plugins tienen otras cosas como las formas y las otras clases. Desde que las clases que quiero para acceder a la instancia del complemento actual similares;

Plugin.Instance.Settings()

Si lo hago campo _instance de asignación en el plugin de Héctor similares;

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

A continuación, para cada uno cargado plugin de la Instancia se sobrescribe y i obtener resultados extraños como PluginB.Instance devolver una instancia de PluginA.

Yo sé Singleton no parece la manera del todo bien para hacer esto, pero yo no era poder venir con otra solución. Tal vez un Multiton puede resolver esto, pero yo no quiero que mis escritores de plugin para ir a

Plugin.Instance["PluginB"] 

todos los tiempos que parece irrelevante.

Gracias por cualquier ayuda.

¿Fue útil?

Solución

Como se sugirió, se debe almacenar estos en una lista de algún tipo, posiblemente en el alojamiento de aplicaciones o, posiblemente, en la biblioteca.

Ya tiene una referencia al complemento actual, con el 'esto' palabra clave, simplemente pase esto en sus otras clases a través de constructor o métodos:

como

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

Otros consejos

Eliminar la palabra clave static y tener un List<Plugin> de iterar sobre ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top