亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用控制器方法注入 dotnet 核心方法

使用控制器方法注入 dotnet 核心方法

C#
Cats萌萌 2021-11-14 14:52:40
假設我在 dotnet 核心中有以下控制器:[Route("api/v1/[controller]")]public class ValuesController : Controller{    private readonly IHandler<ValuesRequest, ValuesResponse> _valueHandler;    private readonly IHandler<ValuesIdRequest, ValuesIdResponse> _valueIdHandler;    public ValuesController(IHandler<ValuesRequest, ValuesResponse> valueHandler,                             IHandler<ValuesIdRequest, ValuesIdResponse> valueIdHandler)    {        _valueHandler = valueHandler;        _valueIdHandler = valueIdHandler;    }    [HttpGet]    public ValuesResponse Get(ValuesRequest request)    {        return _valueHandler.Handle(request);    }    [HttpGet("{id}")]    public ValuesIdResponse Get(ValuesIdRequest request)    {        return _valueIdHandler.Handle(request);    }}正如你在上面的代碼中看到的,我通過構造函數使用依賴注入。但是,我正在考慮如何減少代碼量。所以,我在考慮使用方法注入,這應該將代碼減少到這樣的:[Route("api/v1/[controller]")]public class ValuesController : Controller{    [HttpGet]    public ValuesResponse Get(ValuesRequest request, IHandler<ValuesRequest, ValuesResponse> handler)    {        return handler.Handle(request);    }    [HttpGet("{id}")]    public ValuesIdResponse Get(ValuesIdRequest request, IHandler<ValuesIdRequest, ValuesIdResponse> handler)    {        return handler.Handle(request);    }}我想知道是否可以結合控制器參數來做這樣的事情。我嘗試在網上找到答案,但是我找不到類似的問題/解決方案。
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

使用 FromServices 的參考動作注入

有時,您不需要為控制器中的多個操作提供服務。在這種情況下,將服務作為參數注入 action 方法可能是有意義的。這是通過使用屬性標記參數來完成的,[FromServices]如下所示:

public ValuesResponse Get(ValuesRequest request, [FromServices]IHandler<ValuesRequest, ValuesResponse> handler){
    return handler.Handle(request);
    }


查看完整回答
反對 回復 2021-11-14
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

雖然答案可以在您的操作中使用 [FromService],但我還有另一個建議。

通過閱讀您提供的代碼,我了解到您使用了某種 CQRS。對于這種情況,我可以建議MediatR。然后,您只需將一個接口注入控制器并使用IMediator發送您的請求。通過這種方式,您將保持控制器小而干凈,并且不需要注入所有其他處理程序。

Microsoft 的 IoC-Container有一個很好且方便的擴展,用于注冊所有處理程序和所有其他使用 MediatR 所需的類。

services.AddMediatR(typeof(Startup).Assembly);


查看完整回答
反對 回復 2021-11-14
  • 2 回答
  • 0 關注
  • 252 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號