Код: Выделить всё
public class CreateCustomerHandler(DbContext context): IRequestHandler
{
public async Task Handle(CreateCustomerCommand request, CancellationToken cancellationToken)
{
var c = new Customer()
{
Name = request.Name
};
await context.Customer.AddAsync(c, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return c;
}
}
Код: Выделить всё
public class CreateCustomerHandler(DbContext context): IRequestHandler
{
public async Task Handle(CreateCustomerCommand request, CancellationToken cancellationToken)
{
var c = new Customer()
{
Name = request.Name
};
await context.Customer.AddAsync(c, cancellationToken);
var u = new User()
{
CustomerId = c.Guid
};
await context.User.AddAsync(u, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return c;
}
}
Код: Выделить всё
public class CreatUserHandler(DbContext context): IRequestHandler
{
public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
var u = new User()
{
CustomerId = request.CustomerId
};
await context.User.AddAsync(u, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return u;
}
}
что я пробовал:
1. Использование событий MediaT /> Я попытался решить эту проблему с помощью MediaTr События:
Код: Выделить всё
public class CreateCustomerHandler(DbContext context): IRequestHandler
{
public async Task Handle(CreateCustomerCommand request, CancellationToken cancellationToken)
{
var c = new Customer()
{
Name = request.Name
};
await context.Customer.AddAsync(c, cancellationToken);
await _mediator.Publish(
new CustomerCreatedNotification{
Customer = c
}
);
await context.SaveChangesAsync(cancellationToken);
return c;
}
}
2. выполнение icommands изнутри других обработчиков
, которые я реализовал следующим образом:
Код: Выделить всё
public class CreateCustomerHandler(DbContext context, IMediator mediator): IRequestHandler
{
public async Task Handle(CreateCustomerCommand request, CancellationToken cancellationToken)
{
var c = new Customer()
{
Name = request.Name
};
await context.Customer.AddAsync(c, cancellationToken);
var createUserCommand = new CreateUserCommand()
{
AccountId = c.Guid
};
await mediator.Send(createUserCommand, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return c;
}
}
3. [HttpPost]
public async Task CreateCustomer(CreateCustomerRequest request, CancellationToken cancellationToken)
{
var command = request.Adapt();
var customer = await mediator.Send(command, cancellationToken);
var createUserCommand = new CreateUserCommand
{
AccountId = customer.Guid,
};
var user = await mediator.Send(createUserCommand, cancellationToken);
var response = customer.Adapt();
return Ok(response);
}
< /code>
Однако это также кажется мне неправильным, так как я сейчас выполняю бизнес -логику внутри контроллера ... (это также не транзакционно) < /p>
Есть ли способ избежать дублирования кода в приведенном выше случае, это стоимость использования шаблона CQRS или я просто подхожу к всей проблеме неправильно?
Подробнее здесь: https://stackoverflow.com/questions/794 ... th-mediatr
Мобильная версия