Проект, над которым я сейчас работаю (сводится к этой проблеме), состоит из 3 частей:
- A server class
- An interface
- Plugins that implement the interface
Теперь я хочу отправить сообщение подключенному клиенту из плагина, который загружается как DLL через Reflection в проекте сервера. Конечно, мне нужна функция в классе моего сервера для отправки моего сообщения. Теперь вопрос состоит в том, как вызвать эту функцию из моего плагина, который знает только интерфейс без возможности получить одноэлементную реализацию класса сервера.
Теоретически я бы сказал, я установил пустой указатель на функцию в интерфейсе, который я затем, при загрузке плагина, указываю на мой метод, с помощью которого я затем отправляю сообщение клиенту. Единственное, что я нашел, - это делегаты, которые не могут быть определены в интерфейсе. Так что будет альтернативой?
Ниже псевдокода для иллюстрации. Я надеюсь, что вы понимаете, что я хотел бы сделать, и можете помочь мне найти решение. Важно, чтобы плагины не знали никаких функций о сервере, только метод SendMessage.
псевдокод:
public class Server{
private List<Plugin> mPlugins = new List<Plugin>();
public Server() {
LoadPlugins();
}
public void SendMessage(string message) {
// Here I would send my message to some client
}
private void LoadPlugins() {
// Here I'm loading my plugins (*.dll) from a specific folder into my mPlugins list
// And while I'm looping through my plugins and loading them, I would set the function pointer to SendMessage(); Like:
plugin.SendMyMessage = SendMessage;
}
}
public interface SomeAPI {
string Name {get;set;}
string Version {get;set;}
delegate void SendMyMessage(string message);
}
public class SomePlugin : SomeAPI {
public string Name {get;set;} = "Some plugin";
public string Version {get;set;} = "v1.0.0";
void SendMessage(string message) {
SendMyMessage(message);
}
}