GRASP之間接模式 - Kamil Grzybek

banq發表於2019-09-05

問題:在哪裡指定責任以避免兩件或更多件事之間的直接耦合?
解決方案:將責任分配給中間物件以在其他元件或服務之間進行調解,以使它們不直接耦合。
這是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定義中的命令。這是需要考慮的權衡因素。
 

相關文章