Вот пытаюсь освоить подход CQRS или Command/Query.
Примеры кода из интернетов.
Пример1.
public class CreateUserCommandHandler : EFCommandHandlerBase<CreateUserCommand, ApplicationDbContext>,
ICommandHandler<CreateUserCommand>
{
public CreateUserCommandHandler(ApplicationDbContext dbContext)
: base(dbContext)
{
}
public override void Execute(CreateUserCommand command)
{
Debug.WriteLine("CreateUserCommandHandler executed");
int id = DbContext.Users.Any() == false ? 1 : DbContext.Users.Max(x => x.Id) + 1;
User user = new User
{
Id = id,
FirstName = command.FirstName,
LastName = command.LastName,
Email = command.Email,
IsActive = false
};
DbContext.Users.Add(user);
DbContext.SaveChanges();
command.Id = user.Id;
}
}
вроде как такой подход не совсем правильный, т.к команда может быть частью одной транзакции.
так же видел реализацию через Repository
Пример2
public class CreateStaffCommand : ICommand<CreateStaffCommandContext>
{
private readonly IRepository<Staff> _repository;
public CreateStaffCommand(IRepository<Staff> repository)
{
_repository = repository;
}
public void Execute(CreateStaffCommandContext commandContext)
{
_repository.Add(new Staff(commandContext.Form.Name, commandContext.Form.Quantity));
}
}
такой вариант больше нравится, только вот не могу понять где лучше сохранять транзакцию?