Реализация свойства экземпляра плагина для внутреннего кода области
Я создал свою собственную архитектуру плагинов для одной из моих программ.
По сути, плагин является базовым классом для всех моих плагинов и говорит, что у меня есть плагины, такие как 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 ответа
Как и предполагалось, вы должны хранить их в каком-либо Списке, возможно, в хостинговом приложении или в библиотеке.
У вас уже есть ссылка на текущий плагин с ключевым словом 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();
}
}
Удалить static
Ключевое слово и сохранить List<Plugin>
зациклить их.