События домена определяются клиентом, а не жестко
Требования к нашему продукту SaaS состоят в том, чтобы создать слой домена, в котором любой измененный атрибут или комбинация атрибутов может вызвать событие домена - и впоследствии запустить собственный процесс или уведомление.
Поэтому я не решаюсь добавить тонны кода к слою домена, который запускает тонны объектов DomainEvent, которые могут не иметь смысла для многих арендаторов.
Каждый арендатор будет иметь возможность (через экран пользовательского интерфейса): 1. определить, какие атрибуты им нужны (например, "сумма") и почему (например, сумма больше 100 долларов США) 2. определить, что происходит, когда они меняются (например, удар от процесса одобрения)
Это похоже на интеграцию двигателя бизнес-правил вместе с BPMS. У кого-нибудь есть мысли по поводу более легкой конструкции или решения этой проблемы?
1 ответ
Вы можете опубликовать общее событие, которое имеет свои ограничения / спецификацию, определенную для уникального Name
, Давайте назовем событие SpecificationEvent
, Возможно, вы бы SpecificationEventService
которые могут проверить ваши доменные объекты, которые реализуют ISpecificationValueProvider
и вернуть заполненное событие, которое вы можете опубликовать:
public interface ISpecificationEventValueProvider
{
object GetValue(string name);
}
public class SpecificationEventService
{
IEnumerable<SpecificationEvent> FindEvents(ISpecificationEventValueProvider provider);
}
public class SpecificationEvent
{
private List<SpecificationEventValue> _values;
public string Name ( get; private set; }
public IEnumerable<ISpecificationEventValue> Values
{
get { return new ReadOnlyCollection<ISpecificationEventValue>(_values); }
}
}
public class SpecificationEventValue
{
public string Name { get; private set; }
public object Value { get; private set; }
public SpecificationEventValue(string name, object value)
{
Name = name;
Value = value;
}
}
Таким образом, вы должны определить пользовательские события в каком-то магазине. Возможно, из некоторого внешнего интерфейса, который используется для определения ограничений, которые составляют событие. SpecificationEventService
будет использовать это определение, чтобы определить, соответствует ли объект-кандидат требованиям, а затем вернуть событие с заполненными значениями, которые затем можно опубликовать.
Пользовательский код может быть зарегистрирован в конечной точке, где вы обрабатываете общий SpecificationEvent
, Каждому из пользовательских обработчиков может быть передано событие для обработки, но только тот обработчик, который определяет, что событие является действительным для него, будет выполнять любую реальную обработку.
Надеюсь, что это имеет смысл. Я просто напечатал это, чтобы это был не код производственного уровня, и вы могли бы исследовать использование обобщений для object
:)