我有一些“处理程序”可以触发“代理”(执行某些任务的对象-这里不重要)。
处理程序在监听不同类型的事件:
- 时间事件:每10秒,10分钟(...) - 文件系统事件:文件复制/移动/删除后 - 数据库事件:当记录被添加到数据库表中时 - 邮件事件:当我在我的Office 365邮箱中收到电子邮件时
每个处理程序必须具备以下特点:
- 开始和停止方法(开始/停止捕获事件) - 相关代理的实例 - 触发代理的方式(Process方法+特定的参数集)
每个处理程序应该在特定事件触发时触发相应的代理。
我想从基础处理程序类触发代理,以便我可以将逻辑集中处理(触发事件,捕获异常,管理线程等)。但是,基础处理程序不知道如何调用代理(何时调用此函数,向Process方法发送什么参数),只有专门的子处理程序才知道如何做到这一点。
我唯一找到的方法是在基础处理程序中实现一个接受Action参数的Execute方法...我不喜欢这种方法,因为它并不是很直观(子类需要调用基类,否则什么也不会发生)。我希望能找到更好的设计来处理这个问题。另外,我可以告诉你,我的开发人员会告诉我他们不理解如何使用这个系统。
文件处理程序(处理与文件系统相关的事件)
处理程序在监听不同类型的事件:
- 时间事件:每10秒,10分钟(...) - 文件系统事件:文件复制/移动/删除后 - 数据库事件:当记录被添加到数据库表中时 - 邮件事件:当我在我的Office 365邮箱中收到电子邮件时
每个处理程序必须具备以下特点:
- 开始和停止方法(开始/停止捕获事件) - 相关代理的实例 - 触发代理的方式(Process方法+特定的参数集)
每个处理程序应该在特定事件触发时触发相应的代理。
我想从基础处理程序类触发代理,以便我可以将逻辑集中处理(触发事件,捕获异常,管理线程等)。但是,基础处理程序不知道如何调用代理(何时调用此函数,向Process方法发送什么参数),只有专门的子处理程序才知道如何做到这一点。
我唯一找到的方法是在基础处理程序中实现一个接受Action参数的Execute方法...我不喜欢这种方法,因为它并不是很直观(子类需要调用基类,否则什么也不会发生)。我希望能找到更好的设计来处理这个问题。另外,我可以告诉你,我的开发人员会告诉我他们不理解如何使用这个系统。
abstract class Handler : IHandler
{
public IBroker Broker { get; protected set; }
public event ProcessedEventHandler Processed;
protected void OnProcessed(ProcessExecutionResult result) => Processed?.Invoke(this, result);
public static IHandler Create(IBroker broker)
{
if (broker is ITimerTriggeredBroker)
return new TimeHandler((ITimerTriggeredBroker)broker);
return null;
}
protected Handler(IBroker broker)
{
if (broker == null) throw new ArgumentNullException(nameof(broker));
Broker = broker;
}
public abstract void Start();
public abstract void Stop();
protected void Execute(Action action)
{
var res = new ProcessExecutionResult();
try
{
action?.Invoke();
res.IsSuccess = true;
}
catch (Exception ex)
{
res.Exception = ex;
res.IsSuccess = false;
}
finally
{
OnProcessed(res);
}
}
}
时间处理器(处理与时间相关的事件)
class TimeHandler : Handler
{
private readonly Timer _timer;
private readonly DateTime _start;
private readonly TimeSpan _frequency;
public TimeHandler(ITimerTriggeredBroker broker)
: base(broker)
{
_start = broker.Trigger.StartTime;
_frequency = broker.Trigger.Frequency;
_timer = new Timer(_ => Execute(broker.Process));
}
(...)
}
文件处理程序(处理与文件系统相关的事件)
class FileHandler : Handler
{
private readonly FileSystemWatcher _watcher = new FileSystemWatcher();
public FileHandler(IFileTriggeredBroker broker)
: base(broker)
{
if (!Directory.Exists(broker.Trigger.DirectoryPath))
throw new DirectoryNotFoundException("Unable to locate the supplied directory");
_watcher.Filter = broker.Trigger.Filter;
_watcher.Path = broker.Trigger.DirectoryPath;
_watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.DirectoryName |
NotifyFilters.FileName;
_watcher.Created += (s, a) =>
{
if (IsCopied(a.FullPath)) Execute(() => broker.Process(a.FullPath));
};
}
IHandler > Handler > TimedHandler
? - Nikhil Vartak