Я работаю над приложением для мониторинга системы, аналогичным Nagios в C#. У меня есть интерфейс плагина, определенный как:C# plugin architecture question
public interface IPlugin
{
PluginResult Execute();
}
Каждый плагин, в зависимости от его функциональности, будет иметь переменное количество аргументов. Например, плагин ping может принимать имя хоста, количество пакетов, значение тайм-аута и т. Д. Я хочу, чтобы пользователь мог определить эти аргументы для службы в моем пользовательском интерфейсе, но очевидно, что эти аргументы неизвестны до тех пор, пока приложение обнаруживает, какие плагины доступны. Мне любопытно, как другие могут создавать плагин таким образом, чтобы эти переменные аргументы могли быть обнаружены приложением.
Прямо сейчас, в качестве примера, у меня пинг плагин:
public class PingPlugin : IPlugin
{
private const string RESULT_MESSAGE = "Average ms: {0}; Packet loss: {1}";
private string _hostname;
private int _packets;
private int _timeout;
private int _warningTimeThreshold;
private int _warningLossThreshold;
private int _errorTimeThreshold;
private int _errorLossThreshold;
public PingPlugin(
string hostname,
int packets,
int timeout,
int warningTimeThreshold,
int warningLossThreshold,
int errorTimeThreshold,
int errorLossThreshold)
{
_hostname = hostname;
_packets = packets;
_timeout = timeout;
_warningTimeThreshold = warningTimeThreshold;
_warningLossThreshold = warningLossThreshold;
_errorTimeThreshold = errorTimeThreshold;
_errorLossThreshold = errorLossThreshold;
}
public PluginResult Execute()
{
// execute the plugin
}
}
Я думал, что я мог бы быть в состоянии обнаружить параметры конструктора с помощью отражения и предоставить пользователю с сеткой свойств, чтобы позволить конфигурации плагина, но я не уверен, что лучший способ предоставить набор значений по умолчанию с этим дизайном. Какие могут быть альтернативы?
Проголосуйте за это, MEF удивительно. Серьезно не нужно изобретать колесо здесь. –
Не могу этого поддержать! Почему все настаивают на том, чтобы изобрести систему ** YET ANOTHER PLUG-IN **, даже после MEF? –
MEF позволяет обнаруживать и впрыскивать, но это не отвечает на фундаментальный вопрос, который заключается в том, как динамически отображать и подключать параметры к объекту плагина. MEF сама по себе не является плагиновой системой. Есть еще архитектурная работа, которую нужно сделать, чтобы решить, какие службы должны быть открыты, и как пользователь будет взаимодействовать с плагинами. –