GRASP之控制器模式 - Kamil Grzybek
問題:UI層之外的第一個物件是否接收並協調“控制”系統操作?
解決方案:將責任分配給表示以下選項之一的物件:
- - 表示整個“系統”,“根物件”,執行軟體的裝置或主要子系統(這些都是外觀控制器的變體)
- -表示發生系統操作的用例場景(用例或會話控制器)
這個原則實現取決於我們系統的高階設計,但一般我們需要定義協調我們的業務事務處理的物件。乍一看,似乎Web應用程式/ API中的MVC控制器在這裡是一個很好的例子(即使名稱是相同的)但對我來說並非如此。當然它接收輸入但它不應該協調系統操作 - 它應該將它委託給單獨的服務或命令處理程式:
public class CustomerOrdersController : Controller { private readonly IMediator _mediator; public CustomerOrdersController(IMediator mediator) { this._mediator = mediator; } /// <summary> /// Add customer order. /// </summary> /// <param name="customerId">Customer ID.</param> /// <param name="request">Products list.</param> [Route("{customerId}/orders")] [HttpPost] [ProducesResponseType((int)HttpStatusCode.Created)] public async Task<IActionResult> AddCustomerOrder( [FromRoute]Guid customerId, [FromBody]CustomerOrderRequest request) { await _mediator.Send(new AddCustomerOrderCommand(customerId, request.Products)); return Created(string.Empty, null); } } public class AddCustomerOrderCommandHandler : IRequestHandler<AddCustomerOrderCommand> { private readonly ICustomerRepository _customerRepository; private readonly IProductRepository _productRepository; private readonly IForeignExchange _foreignExchange; public AddCustomerOrderCommandHandler( ICustomerRepository customerRepository, IProductRepository productRepository, IForeignExchange foreignExchange) { this._customerRepository = customerRepository; this._productRepository = productRepository; this._foreignExchange = foreignExchange; } public async Task<Unit> Handle(AddCustomerOrderCommand request, CancellationToken cancellationToken) { // handling... } } |
相關文章
- GRASP之間接模式 - Kamil Grzybek模式
- GRASP 之資訊專家模式 - Kamil Grzybek模式
- GRASP之多型性模式 - Kamil Grzybek多型模式
- GRASP之受保護的變化 - Kamil Grzybek
- 比SOLID更重要的與DDD設計相關的GRASP原則 - Kamil GrzybekSolid
- Clean清潔領域模型的幾個特點 -Kamil Grzybek模型
- 極簡架構模式-前端控制器模式架構模式前端
- High precision grasp pose detection in dense clutter
- SAP: SALV 利用控制器的模式模式
- DDD當前工程方法組合 - Kamil
- jmeter基礎邏輯控制器之ForEach控制器JMeter
- Using Geometry to Detect Grasp Poses in 3D Point Clouds3DCloud
- Swoft 學習筆記之控制器筆記
- Symfony筆記之–控制器的快捷方法筆記
- iOS開發之返回指定的控制器iOS
- 設計模式之策略模式設計模式
- 設計模式之代理模式設計模式
- 設計模式之Plugin模式設計模式Plugin
- 《設計模式》之代理模式設計模式
- 設計模式之命令模式設計模式
- 設計模式之-命令模式設計模式
- 設計模式之【策略模式】設計模式
- Javascript設計模式之代理模式JavaScript設計模式
- Java設計模式之builder模式Java設計模式UI
- 行為型模式之策略模式模式
- 設計模式之單例模式設計模式單例
- PHP 設計模式之策略模式PHP設計模式
- python設計模式之策略模式Python設計模式
- 設計模式之——狀態模式設計模式
- Java設計模式之代理模式Java設計模式
- 設計模式之----Java模板模式設計模式Java
- 設計模式之模板方法模式設計模式
- 設計模式之☞單例模式設計模式單例
- JavaScript 設計模式之策略模式JavaScript設計模式
- Javascript設計模式之命令模式JavaScript設計模式
- Javascript設計模式之策略模式JavaScript設計模式
- 設計模式之門面模式設計模式
- 設計模式之原型模式設計模式原型