GRASP之间接模式 - Kamil Grzybek

19-09-05 banq
                   

问题:在哪里指定责任以避免两件或更多件事之间的直接耦合?

解决方案:将责任分配给中间对象以在其他组件或服务之间进行调解,以使它们不直接耦合。

这是Mediator Pattern的用武之地。而不是直接耦合:

public class CustomerOrdersController : Controller
{
    private readonly IOrdersService _ordersService;

    public CustomerOrdersController(IOrdersService ordersService)
    {
        this._ordersService = ordersService;
    }
}

我们可以使用mediator对象并在对象之间进行调解:

public class CustomerOrdersController : Controller
{
    private readonly IMediator _mediator;

    public CustomerOrdersController(IMediator mediator)
    {
        this._mediator = mediator;
    }

    public async Task<IActionResult> AddCustomerOrder(
        [FromRoute]Guid customerId, 
        [FromBody]CustomerOrderRequest request)
    {
       await _mediator.Send(new AddCustomerOrderCommand(customerId, request.Products));

       return Created(string.Empty, null);
    }
}

请注意这里。间接支持低耦合但降低了整个系统的可读性和推理。您不知道哪个类处理Controller定义中的命令。这是需要考虑的权衡因素。