Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C# Архитектура простого приложения Сервис работы с Мероприятиями , пока создаю ядро (я начинающий).Вопрос по валидац

vato 1 Мастер (1463), на голосовании 1 месяц назад
Я уже сделал папку моделей и сервисов так же сделал папку с Коммандами ,которые будут в роли DTO и включают в себя валидацию. Валидацию вроде прописал , но столкнулся с тем , что у мероприятия есть статус и я его реализовал через enum в душе не чаю как прописать Валидации для enum а так же переход из одного состояния в другое , если допустим меняется статус то будут ограничения в бизнес логике (CRUD) . Апи и Базы пока не трогаю затем буду поэтапно добавлять.
  
using EventManager.Service.Exceptions;
using EventManager.Service.Models;

namespace EventManager.Service.Commands;

public abstract class EventCommand
{
public int EventId { get; set; }
public required string Name { get; set; }
public required string Description { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public TimeSpan Duration { get; set; }
public required string Location { get; set; }
public required EventStatus Status { get; set; }


public void Validate()
{
if (EventId <= 0) throw new ValidationException("Event Id must be positive");
if (Name.Length < 1 || Name.Length > 100) throw new ValidationException("Name length must be between 1 and 100 chars");
if (Description.Length < 1 || Description.Length > 4000) throw new ValidationException("Description text length must be between 1 and 4000 chars");
if (Location.Length < 1 || Location.Length > 4000) throw new ValidationException("Location length must be between 1 and 4000 chars");
}
public abstract void ValidateDateAndDuration();
}
 using EventManager.Service.Exceptions; 

namespace EventManager.Service.Commands;

public class CreateEventCommand : EventCommand
{
public override void ValidateDateAndDuration()
{
if (StartDate < DateTime.Now)
{
throw new ValidationException("Start date must be in the future.");
}
if (EndDate <= StartDate)
{
throw new ValidationException("End date must be later than start date.");
}
Duration = EndDate - StartDate;
}
}
 using EventManager.Service.Exceptions; 
using EventManager.Service.Models;
namespace EventManager.Service.Commands;

public class UpdateEventCommand : EventCommand
{
public override void ValidateDateAndDuration()
{
if (DateTime.Now > StartDate) throw new ValidationException("Start date must be in future");

if (EndDate <= StartDate)
{
throw new ValidationException("End date must be later than start date.");
}
Duration = EndDate - StartDate;
}
public void ValidationForUpdate()
{
if (Status == EventStatus.Completed || Status == EventStatus.Cancelled)
{
throw new ValidationException("Cannot change status of completed or cancelled events.");
}
}
}
Голосование за лучший ответ
Jurijus Zaksas Искусственный Интеллект (458580) 2 месяца назад
> в душе не чаю как прописать Валидации для enum
А главное - зачем это вообще надо? Компилятор не даст тебе использовать неизвестное значение, нафига еще что-то писать?

Еще такой момент. Все твои валидации вообще-то принято писать в сеттерах. Которые, собссно, и сохраняют объект в валидном состоянии, и по принципу инкапсуляции не дают его поломать. Нахрена делать какой-то валидатор, который может быть запросто никем не вызван?
vato 1Мастер (1463) 2 месяца назад
Статус Мероприятия важен , чтобы контролировать обновление , удаление нельзя удалить мероприятие которое не закончено или не отложено , а также нельзя обновить мероприятие , которое закончилось или отменено . Разве это излишне?
[ ] [ ] Мастер (1494) 2 месяца назад
Когда пишешь валидатор не надо тебе каждый раз один и тот же экзепшн вызывать при каждом, мать его, действии

Создаешь класс валидатора для конкретной команды, например Create, затем наследуешься от AbstractValidator из FluentAssertation
типа
 public class CreateCommandValidator : AbstractValidator<CreateCommand> 
потом в конструкторе пишешь правила

 public CreateCommandValidator()
{
RuleFor(cr => cr.FirstName)
.NotEmpty()
.WithMessage("Имя не должно быть пустым.")
.MaximumLength(150)
.WithMessage("Имя не должно превышать 150 символов.");
}

И так для каждой команды
vato 1Мастер (1463) 2 месяца назад
Спасибо
Похожие вопросы