Я занимаюсь разработкой приложения ASP.NET MVC с трехслойной классической архитектурой.
1. доступ к данным (хранилища)
2. Бизнес логика (Услуги)
3. Прикладной уровень (классы контроллера MVC)
Задача состоит в том, чтобы ученик имел класс предметной области, и ученики могут сдавать экзамены, сдавать экзамен, составлять заказ (класс заказа), после чего ученик должен сдавать экзамен, нам нужно опубликовать результаты экзамена для каждого учащегося (это означает, что оценка выставляется и оценка) и имеет некоторые бизнес-правила, которые должны быть проверены
1. результаты еще не опубликованы
2. все учащиеся, имеющие статус, должны иметь отметку
3. Граница оценки должна быть подтверждена (оценки и оценка за экзамен)
Когда пользователь публикует результаты, все эти правила должны проверяться, а если какое-то правило не выполняется, должно отображаться сообщение об ошибке.
Я решил, что вся логика, связанная с бизнес-правилами проверки, хранится в классе Service, и если какое-либо правило не проходит определенное исключение, в классе контроллера это исключение будет перехватывать и отображать ошибку для клиента. Вот код
Класс обслуживания
public void ReleaseResults(long orderId)
{
var order =orderRepository.Get(orderId);
Check.Require(order != null, "Order was not found");
if (IsOrderReleased(order))
{
throw new ReleaseResultsException("The results has been already released", order.OrderNo);
}
if (AllLearnersHasStatusPresentAndMark(order))
{
throw new ReleaseResultsException("One or more learners unmarked", order.OrderNo);
}
if (!GradingBoundaryConfirmed(order))
{
throw new ReleaseResultsException("The Grading boundary needs to be confirmed", order.OrderNo);
}
foreach (var learnerDetail in order.LearnerDetails)
{
if (HasNotStatusPresent(learnerDetail))
{
continue;
}
learnerDetail.SetReleasedResults();
}
orderRepository.SaveOrUpdate(order);
}
Класс контроллера
public ActionResult Release(EncryptedId orderId)
{
Check.Require(orderId != null, "The parameter orderId was null");
try
{
orderReleaseResultsService.ReleaseResults(orderId);
}
catch (ReleaseResultsException e)
{
return Content(string.Format("Error: {0}", e.Message));
}
return Content(MUI.TheResultsHasBeenReleased);
}
Я не уверен, что это лучший способ проверки бизнес-правил. Может ли кто-нибудь помочь мне с предложениями или лучшим решением этой проблемы?
Заранее спасибо!