C# CQRS与WebAPI设计

C# CQRS与WebAPI设计,c#,asp.net-web-api2,cqrs,C#,Asp.net Web Api2,Cqrs,我最近一直在研究cqr和sidewebapi。我理解读和写之间的分离,即查询和命令。我的问题是,我的Web Api操作,例如[HttpGet]是否应该期望一个封装属性的查询参数,如(SortParam、Page、PageSize等),或者我是否应该/可以单独公开这些参数,然后创建一个查询对象并将其传递给处理程序?因此,我的行为本质上应该是什么样子的: public IHttpActionResult Get(Query query) { try { var res

我最近一直在研究cqr和sidewebapi。我理解读和写之间的分离,即查询和命令。我的问题是,我的Web Api操作,例如[HttpGet]是否应该期望一个封装属性的查询参数,如(SortParam、Page、PageSize等),或者我是否应该/可以单独公开这些参数,然后创建一个查询对象并将其传递给处理程序?因此,我的行为本质上应该是什么样子的:

public IHttpActionResult Get(Query query)
{
    try
    {
        var result = _queryDispatcher.Dispatch<Query, QueryResult>(query);
        return Ok(result);
    }
    catch (Exception)
    {
        return InternalServerError();
    }
}
公共IHttpActionResult获取(查询) { 尝试 { var result=\u queryDispatcher.dispatcher(查询); 返回Ok(结果); } 捕获(例外) { 返回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();
    }
}
公共IHttpActionResult获取(字符串sortBy=“id”,int page=1,int pageSize=maxPageSize) { 尝试 { var query=new query{SortParam=sortby,Page=Page,PageSize=PageSize}; var result=\u queryDispatcher.dispatcher(查询); 返回Ok(结果); } 捕获(例外) { 返回InternalServerError(); } }
这是一个意见问题。尽管如此,我仍然认为,这是完全可以接受的

单独公开这些参数,然后创建查询对象并将其传递给处理程序

该框架允许两者兼而有之。对于第一个,使用[FromUri]参数属性从查询字符串构建复杂对象

[HttpGet]
public IHttpActionResult Get([FromUri]Query query) {
    var result = _queryDispatcher.Dispatch<Query, QueryResult>(query);
    return Ok(result);
}
[HttpGet]
公共IHttpActionResult获取([FromUri]查询){
var result=\u queryDispatcher.dispatcher(查询);
返回Ok(结果);
}
或者直接使用公开的参数

[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);
}
[HttpGet]
公共IHttpActionResult Get(字符串sortBy=“id”,int page=1,int pageSize=maxPageSize){
var query=new query{SortParam=sortby,Page=Page,PageSize=PageSize};
var result=\u queryDispatcher.dispatcher(查询);
返回Ok(结果);
}
它们都产生相同的功能

但是,第一种方法更易于维护,因为如果添加了任何新属性,则无需更改操作,因为框架将根据提供的参数绑定模型


此外,如果目标是保持控制器精简,则不要处理操作中的错误,而是应用横切关注点,并由异常过滤器处理它

这是一个意见问题。但是,我认为,将
这些参数单独公开,然后创建一个查询对象并将其传递给处理程序是完全正确的。此外,如果目标是保持控制器精简,则不要处理操作中的错误,而是应用横切关注点,并由异常过滤器处理。感谢您解决我的困惑。非常感谢,这很有道理。同时也感谢异常过滤器提醒。很高兴能提供帮助。我最近一直在关注这篇关于这个主题的文章。这是一本有趣的书。快乐编码!!!