Asp.net

.NET Core 2 - 創建具有儲存庫的控制器類的實例

  • August 16, 2021

我有以下控制器類;

public class MyController: Controller
{
   private IValueService _service;

   public MyController(IValueService service)
   {
       this._service = service;
   }

   public void MyMethod()
   {
       var values = _service.GetAll();
   }
}

我想創建這個類的一個實例並呼叫方法 MyMethod(),例如

var MyCopy = new MyController();
MyCopy.MyMethod();

但是我收到了我需要提供所需服務參數的消息。我將如何創建一個具有服務(儲存庫)的控制器實例,以便我可以呼叫它的方法?

好吧,在啟動時,我想在使用儲存庫的類中執行一個方法。此方法首先打開一個 SocketIO 連接,然後它應該使用儲存庫將新傳入的數據保存到數據庫中。

那麼該邏輯不應該在控制器內部,而是在某些服務類型中,而不是在依賴注入容器中註冊。控制器將響應某些路由上的請求,但您的事情聽起來像是您的應用程序中在請求之外執行的一般初始化步驟。所以不應該涉及控制器。

相反,您想先提供一些服務:

public class MyInitializationService
{
   private readonly IValueService _valueService;

   public MyInitializationService(IValueService valueService)
   {
       _valueService = valueService;
   }

   public void Initialize()
   {
       var values = _valueService.GetAll();
       // do something
   }
}

然後在類的ConfigureServices方法中註冊Startup該類:

services.AddTransient<MyInitializationService>();

然後,您可以將該類型注入Configure方法並呼叫其Initialize方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, MyInitializationService initializationService)
{
   initializationService.Initialize();

   // …
   app.UseStaticFiles();
   app.UseMvc();
}

當應用程序啟動時,有多種方法可以在開始時執行某些東西。在內部呼叫它Configure只是一種方法,這可能合適也可能不合適,具體取決於您希望程式碼執行多早(因為Configure執行得非常早)。另一種好方法是註冊ApplicationStarted對應用程序生命週期事件的回調。我在這裡有一個答案,其中包含更多詳細資訊。

在啟動文件中添加:

services.AddMvc().AddControllersAsServices();  

它將使用 DI 容器註冊應用程序中的所有控制器。

然後 :

  var serviceProvider = HttpContext.RequestServices;
    var controller =(MyController)serviceProvider.GetRequiredService<MyController>();
    controller.Method();

引用自:https://stackoverflow.com/questions/48633396