Asp.net web api 中介模式-在控制器中还是在应用程序服务中?[asp.net web api]

Asp.net web api 中介模式-在控制器中还是在应用程序服务中?[asp.net web api],asp.net-web-api,mediator,mediatr,Asp.net Web Api,Mediator,Mediatr,在我的下一个项目中,我想使用mediator模式(带mediatr-lib)。在我看到的所有示例中,它们都直接将其注入控制器 我不喜欢它的一点是,如果有一种情况,我想在POST/PUT/PATCH请求之后返回一个URL,而不仅仅是201,例如,创建/更新资源的完整版本,我必须在控制器本身中执行所有操作,这对控制器来说太多了(我只想发送/分派请求) 所以,我的问题是——在控制器中直接使用中介器真的是一种惯例吗?或者只是出于示例目的,而在生产代码中,中介器会进入某种应用程序服务层?我已经在几个个人项

在我的下一个项目中,我想使用mediator模式(带mediatr-lib)。在我看到的所有示例中,它们都直接将其注入控制器

我不喜欢它的一点是,如果有一种情况,我想在
POST/PUT/PATCH
请求之后返回一个URL,而不仅仅是
201
,例如,创建/更新资源的完整版本,我必须在控制器本身中执行所有操作,这对控制器来说太多了(我只想发送/分派请求)


所以,我的问题是——在控制器中直接使用中介器真的是一种惯例吗?或者只是出于示例目的,而在生产代码中,中介器会进入某种应用程序服务层?

我已经在几个个人项目中使用了中介器,我发现到目前为止,我的控制器非常干净并遵循一个非常简单、可预测的模式

在中介器的配置中,您告诉它哪些项目包含请求或通知处理程序。这可能与API位于同一个项目中,但可能是一个完全独立的项目。它当然不需要位于控制器本身中

然后,实际的中介被注入到控制器中,就像一个日志记录程序一样,因此您可以向它抛出消息。控制器不关心由哪个项目或服务层处理这些消息,这是由中介知道的,但如果您使用的是
IRequest
,您可以在控制器中等待响应。(如果您使用的是
INotification
,则可能会导致多个事件发生。)

无论如何,几乎我所有的控制器方法都或多或少遵循了这个基本模式。正如您所看到的,这是从GET返回一个对象,但相同的原则适用于任何其他动词:

public async Task<IActionResult> GetItemByReference(string reference)
{
    try
    {
        IItem item =
            await this.Mediator.Send(
                new GetItemByReferenceRequest()
                {
                    Reference = reference,
                });

        if (item == null)
        {
            return this.NotFound();
        }

        return this.Ok(item);
    }
    catch (ArgumentException ex)
    {
        return this.BadRequest(ex.Message);
    }
}
public异步任务GetItemByReference(字符串引用)
{
尝试
{
项目=
等待这个,调停者,发送(
新建GetItemByReferenceRequest()
{
参考=参考,
});
如果(项==null)
{
返回此.NotFound();
}
返回此。确定(项目);
}
捕获(参数异常)
{
返回此.BadRequest(例如消息);
}
}
从解决方案的角度来看,我的结论与此类似:

  • “UI”项目,可能是MVC或API项目
  • 包含所有mediatr请求对象的项目
  • 执行请求处理的一个或多个项目
如果需要更改请求的处理方式,我可以创建一个新的处理程序项目,并在中介配置期间将其指向该新项目,或者更新现有的处理程序项目


我希望这能说明我是如何发现MediatR是一种很好的方法,可以在我自己的经验中分离出关注点,并帮助您决定是否使用它!

如果您想返回更新的资源以响应
PUT
请求,或者如果您想返回新创建的完整资源(而不仅仅是URL),会发生什么情况响应
POST
request?发送将创建或更新资源的请求,并从消息处理程序返回创建或更新的资源。然后从控制器方法返回它。