2016-11-23 54 views
1

我最近一直在研究CQRS和Web API。我理解读写之间的区别,即查询和命令。我的问题是,我是否Web Api行为,例如[HttpGet]应该期望查询参数封装像(SortParam,Page,PageSize等...)的属性,或者应该/我可以将这些参数单独暴露并且然后创建一个Query对象并将其传递给处理程序?所以基本上应该怎么我的行动的样子:CQRS和WebAPI设计

public IHttpActionResult Get(Query query) 
{ 
    try 
    { 
     var result = _queryDispatcher.Dispatch<Query, QueryResult>(query); 
     return Ok(result); 
    } 
    catch (Exception) 
    { 
     return InternalServerError(); 
    } 
} 

或者是确定的,如果它看起来像:

public IHttpActionResult Get(string sortBy = "id", int page = 1, int pageSize = maxPageSize) 
{ 
    try 
    { 
     var query = new Query { SortParam = sortby, Page = page, PageSize = pageSize }; 
     var result = _queryDispatcher.Dispatch<Query, QueryResult>(query); 
     return Ok(result); 
    } 
    catch (Exception) 
    { 
     return InternalServerError(); 
    } 
} 
+1

这是见仁见智的问题进行处理。然而,我认为保持这些参数是单独暴露的,然后创建一个Query对象并沿处理器传递它是完全正确的。另外,如果目标是保持控制器精简,则不要处理操作中的错误,而是应用横切关注点并使其由异常过滤器处理。 – Nkosi

回答

2

这是见仁见智的问题。也就是说,我认为它是完全正常的

保持这些参数单独公开,然后创建一个查询对象并沿处理程序传递它。

框架允许这两个。对于第一个使用[FromUri]参数属性来构建查询字符串的复杂对象。

[HttpGet] 
public IHttpActionResult Get([FromUri]Query query) { 
    var result = _queryDispatcher.Dispatch<Query, QueryResult>(query); 
    return Ok(result); 
} 

或只是去暴露参数。

[HttpGet] 
public IHttpActionResult Get(string sortBy = "id", int page = 1, int pageSize = maxPageSize) { 
    var query = new Query { SortParam = sortby, Page = page, PageSize = pageSize }; 
    var result = _queryDispatcher.Dispatch<Query, QueryResult>(query); 
    return Ok(result); 
} 

它们都产生相同的功能。

然而,第一个允许更容易的可维护性,因为如果添加了任何新属性,则不需要更改动作,因为框架将根据提供的参数绑定模型。

此外,如果目标是保持控制器瘦然后不处理在操作错误而申请的交叉问题,并交由异常过滤器

+0

感谢您解决我的困惑NKosi。非常感谢,它非常有意义。并感谢您的例外过滤器提醒。 – Jinish

+0

很高兴提供帮助。最近我一直在关注这篇文章。这是一个有趣的阅读。 http://codeopinion.com/fat-controller-cqrs-diet/快乐编码! – Nkosi