Я заранее извиняюсь, но это будет длинный вопрос.
Я застрял. Я пытаюсь изучить модульное тестирование, C # и шаблоны проектирования - все сразу. (Может быть, это моя проблема.) Поэтому я читаю «Искусство модульного тестирования» (Ошерове), «Чистый код» (Мартин) и «Шаблоны проектирования первых конструкций» (О'Рейли).
Я только сейчас начинаю понимать делегатов и события (которые вы бы увидели, если бы троллили мои так недавние вопросы). Я до сих пор не совсем получил лямбды.
Для контекстуализации всего этого я дал себе учебный проект, который я называю goAlarms. У меня есть класс Alarm с членами, которых вы ожидаете (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 идеально подходит для этого, поэтому я создал класс QuartzAlarmScheduler, который реализует IAlarmScheduler.
Все в порядке. Моя проблема в том, что класс Alarm является абстрактным, и я хочу создать много разных типов тревог. Например, у меня уже есть сигнал сердцебиения (срабатывает через каждые (int) интервал минут), AppointmentAlarm (срабатывает в установленные дату и время), ежедневный сигнал тревоги (срабатывает каждый день в X) и, возможно, другие.
И Quartz.NET идеально подходит для этого.
Моя проблема - проблема дизайна. Я хочу иметь возможность создавать тревогу любого рода без моего класса Alarm (или любых производных классов), ничего не знающего о Quartz. Проблема в том, что в Quartz есть отличные фабрики, которые возвращают только правильные настройки для триггеров, которые будут нужны моим классам Alarm. Так, например, я могу получить триггер Quartz, используя TriggerUtils.MakeMinutelyTrigger, чтобы создать триггер для сигнала сердцебиения, описанного выше. Или TriggerUtils.MakeDailyTrigger для ежедневной тревоги.
Полагаю, я мог бы подвести итог так. Косвенно или напрямую я хочу, чтобы мои классы сигналов тревоги могли использовать классы TriggerUtils.Make *, ничего не зная о них. Я знаю, что это противоречие, но именно поэтому я задаю вопрос.
Я думал о том, чтобы поместить в делегат поле делегата, которому будет назначен один из этих методов Make, но, делая это, я создаю жесткую зависимость между сигнализацией и Quartz, которую я хочу избежать как для целей модульного тестирования, так и для целей проектирования. Я думал об использовании переключателя для типа в QuartzAlarmScheduler для здесь , но я знаю, что это плохой дизайн, и я пытаюсь изучить хороший дизайн.
Вы, ребята, потрясающие, и заранее спасибо за ваши ответы.
Сет