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