Я занимаюсь разработкой системы стимулирования сбыта, и я только что натолкнулся на что-то, что, вероятно, могло бы быть обработано с помощью шаблона конечного автомата, но у меня пока нет опыта работы с конечными автоматами. Может быть, конечный автомат совершенно бесполезен в этой ситуации :)
Таким образом, у меня есть рекламная акция, которая имеет определенную продолжительность, несколько назначенных клиентов, продукты, скидки и т. Д. Каждая акция также имеет свое состояние. Там около 5 штатов. Переходы между состояниями строго определены - невозможно напрямую изменить состояние 1 на состояние 3 - пользователь должен сначала изменить состояние на 2. Есть некоторые ограничения, такие как «невозможно добавить больше продуктов, когда продвижение в состоянии 3-5». Или ограничения типа «только суперпользователи могут редактировать затраты на продвижение, когда они находятся в состоянии 3-5».
Я только что прочитал о http://www.codeplex.com/SimpleStateMachine, но я не уверен, что это не слишком сложно для этого случая. Я мог бы обрабатывать логику состояния на своем сервисном уровне, используя такие вещи, как:
if (promotion.state == statesRepository.GetState3() && false == loggedUser.IsInRole("superUser")){
throw new PromotionStateException("user not allowed to edit promotion in this status");
}
...
или
public void ChangePromotionStatus(promotion, newStatus){
if (promotion.Status == status1 && newStatus != statesRepo.GetState2()){
throw new StateTransitionException("unable to change from status 1 to " + newStatus);
}
}
Но мне не нравится этот вид кода - должен быть какой-то лучший подход :) У кого-нибудь есть совет? Конечно, я мог бы разделить заботы и разработать такие службы, как PromotionStatusChangeReviewService, PromotionEditPermissionService и т. Д., Чтобы сделать код менее связанным, но, возможно, есть какое-то лучшее решение, которого я сейчас не вижу.