Реализация свойства экземпляра плагина для внутреннего кода области - PullRequest
0 голосов
/ 12 ноября 2010

Я создал свою собственную архитектуру плагинов для одной из моих программ.

В основном плагин является базовым классом для всех моих плагинов и говорит, что у меня есть плагины, такие как PluginA: Plugin, PluginB: Plugin.

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

Теперь, как обычно, каждый из моих плагинов имеет другие вещи, такие как формы и другие классы. Из этих классов я хочу получить доступ к текущему экземпляру плагина, как;

Plugin.Instance.Settings()

Если я назначу поле _instance в плагине ctor, как;

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

Затем для каждого загруженного плагина Экземпляр перезаписывается, и я получаю странные результаты, такие как PluginB.Instance, возвращающий экземпляр PluginA.

Я знаю, что синглтон не совсем правильный способ сделать это, но я не смог найти другое решение. Может быть, Multiton может решить эту проблему, но я не хочу, чтобы мои авторы плагинов пошли на

Plugin.Instance["PluginB"] 

все время, которое кажется неуместным.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2010

Как и предполагалось, вы должны хранить их в каком-либо списке, возможно, в хост-приложении или в библиотеке.

У вас уже есть ссылка на текущий плагин с ключевым словом this.просто передайте это другим классам через конструктор или методы:

вроде

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();
     } 
}
0 голосов
/ 12 ноября 2010

Удалите ключевое слово static и оставьте List<Plugin>, чтобы зациклить их.

...