Я работаю над приложением для мониторинга системы, похожим на Nagios в C #. У меня есть интерфейс плагина, определенный как:
public interface IPlugin
{
PluginResult Execute();
}
Каждый плагин, в зависимости от его функциональности, будет иметь переменное количество аргументов. Например, пинг плагин может принимать имя хоста, количество пакетов, значение времени ожидания и т. Д. Я хочу, чтобы пользователь мог определять эти аргументы для каждой службы в моем пользовательском интерфейсе, но, очевидно, эти аргументы не будут известны до приложение обнаруживает, какие плагины доступны. Мне любопытно, как другие могут спроектировать плагин так, чтобы эти переменные аргументы могли быть обнаружены приложением.
Прямо сейчас, например, у меня есть пинг плагин:
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
}
}
Я думал, что смогу обнаружить параметры конструктора, используя отражение, и предоставить пользователю сетку свойств, чтобы разрешить настройку плагина, но я не уверен, что это лучший способ предоставить набор значений по умолчанию с этим дизайн. Какие могут быть некоторые альтернативы?