【发布时间】:2010-06-02 01:27:49
【问题描述】:
我提前道歉,但这将是一个很长的问题。
我被困住了。我正在尝试同时学习单元测试、C# 和设计模式。 (也许这是我的问题。)因此,我正在阅读单元测试艺术(Osherove)、清洁代码(Martin)和 Head First Design Patterns(O'Reilly)。
我现在才刚刚开始了解代表和事件(如果您要拖钓我最近的 SO 问题,您会看到这些)。我仍然不太了解 lambdas。
为了了解所有这些,我给自己制定了一个学习项目,我称之为 goAlarms。我有一个警报类,其中包含您期望的成员(NextAlarmTime、Name、AlarmGroup、Event Trigger 等)
我希望闹钟的“定时器”是可扩展的,所以我创建了一个 IAlarmScheduler 接口,如下所示......
public interface AlarmScheduler
{
Dictionary<string,Alarm> AlarmList { get; }
void Startup();
void Shutdown();
void AddTrigger(string triggerName, string groupName, Alarm alarm);
void RemoveTrigger(string triggerName);
void PauseTrigger(string triggerName);
void ResumeTrigger(string triggerName);
void PauseTriggerGroup(string groupName);
void ResumeTriggerGroup(string groupName);
void SetSnoozeTrigger(string triggerName, int duration);
void SetNextOccurrence (string triggerName, DateTime nextOccurrence);
}
这个 IAlarmScheduler 接口定义了一个组件,它将引发警报(触发器),该警报将冒泡到我的警报类并引发警报本身的触发事件。它本质上是“定时器”组件。
我发现 Quartz.net 组件非常适合这个,所以我创建了一个实现 IAlarmScheduler 的 QuartzAlarmScheduler 类。
一切都好。我的问题是警报类是抽象的,我想创建很多不同种类的警报。例如,我已经有一个 Heartbeat 警报(每隔 (int) 分钟间隔触发)、AppointmentAlarm(在设定的日期和时间触发)、Daily Alarm(每天在 X 触发),也许还有其他。
Quartz.NET 非常适合处理这个问题。
我的问题是设计问题。我希望能够在我的 Alarm 类(或任何派生类)不了解 Quartz 的情况下实例化任何类型的警报。问题是 Quartz 有很棒的工厂,它们为我的警报类需要的触发器返回正确的设置。因此,例如,我可以通过使用 TriggerUtils.MakeMinutelyTrigger 为上述心跳警报创建触发器来获得 Quartz 触发器。或 TriggerUtils.MakeDailyTrigger 用于每日警报。
我想我可以这样总结。间接或直接地,我希望我的警报类能够使用 TriggerUtils.Make* 类,而无需对它们一无所知。我知道这是一个矛盾,但这就是我问这个问题的原因。
我考虑将一个委托字段放入警报中,该字段将被分配这些 Make 方法之一,但这样做我在警报和 Quartz 之间创建了一个硬依赖关系,我希望避免出于单元测试目的和设计目的。我曾想过根据here 为 QuartzAlarmScheduler 中的类型使用一个开关,但我知道这是糟糕的设计,我正在努力学习好的设计。
你们太棒了,提前感谢您的回答。
赛斯
【问题讨论】:
标签: c# design-patterns interface