簡體   English   中英

Controller 之外的依賴注入

[英]Dependency Injection outside of Controller

再會。 我在理解依賴注入時遇到了問題。

所以我到底需要的是從子對象訪問父對象。 例如,我有我的MainProgram object。 這個 object 創建另一個 object,另一個 object 創建 3-d 對象等等。 讓我們停下來看看孩子 object #5

這個孩子需要參考 object #1。

我不明白如何以更好的方式做到這一點。 但后來我開始搜索並找到一個叫做依賴注入的東西。

我真的希望這件事是我問題的正確答案(如果不是,請告訴)。

所以在我的問題和例子中。 我正在嘗試為我的一項服務創建 WEB API。 使用 ASP .NET Core 6

首先,我創建了一個簡單的 class ,它將是MainProgram ,當服務器將收到帶有所需數據的 POST 請求時,它將啟動一些多線程工作。

public class MainProgram
{
   public int MaxThreads { get; set; }
   public int OrderCounter { get; set; }
   public AdjustableSemaphore Semaphore { get; set; }

   public MainProgram(int maxThreads)
   {
      MaxThreads = maxThreads;
      Semaphore = new AdjustableSemaphore(MaxThreads);
   }

   public async Task StartOperation(IApiOperation operation)
   {
      try
      {
         operation.Prepare();
         operation.Start();
         while (!operation.IsReady())
         {
            await Task.Delay(500);
         }
         operation.Finish();
      }
      catch (Exception e)
      {
         Console.ForegroundColor = ConsoleColor.Red;
         Console.WriteLine(e.Message);
         Console.ResetColor();
      }
   }

   public string OperationStatus(IApiOperation operation)
   {
      return operation.ShowDetails();
   }
}

然后我將此 class 添加到Program.cs以獲取依賴關系。

builder.Services.AddSingleton(program => new MainProgram(1000));

我為我的 Controller 制作了一個構造函數,就像在我閱讀的示例中一樣,一切都很好。

Controller 自己創建MainProgram的實例。

[ApiController]
[Route("/")]
public class ApiController : ControllerBase
{
  private MainProgram _mainProgram;
  public ApiController(MainProgram mainProgram)
  {
    _mainProgram = mainProgram;
  }
  
  [HttpPost]
  [Route("test")]
  public string Get()
  {
    TestOperation to = new TestOperation(_mainProgram);
    new Thread(() =>
    {
      var project =  _mainProgram.StartOperation(to);
    }).Start();
    return $"Started task #{to.Id}";
  }
}

我遇到的問題在這一行

TestOperation to = new TestOperation(_mainProgram);

TestOperation還具有來自MainProgram的依賴項。 我知道我可以在其中傳遞我的私人_mainProgram

但是讓我們假設TestOperation也有一個孩子,這個孩子也有一個孩子,只有第三個需要MainProgram的鏈接。 我認為這就是依賴注入提供幫助的地方。

主要問題是

如果我不能編寫new TestOperation(WITHOUT ATTRIBUTE) ,如何創建具有依賴於MainProgram的構造函數的對象? 這將是一個語法錯誤。

我認為你會避免依賴循環;

如果無法避免,可以嘗試將 IServiceProvider 注入到您的服務中,並通過 provider.GetService() 方法獲取目標服務,您可以嘗試創建一個 Parameterservice 或 Static class 來保存您需要的參數,我嘗試如下:

服務:

interface IA {int methodA();}
interface IB { int methodB(); }
interface IC { int methodC(); }
interface IParameterService {  }
public class ParameterService: IParameterService
{
    public  int APara;
    public  int BPara;
    public ParameterService(int para)
    {
        APara = para+1;
    }
}
    
public class A : IA
{
    private readonly IServiceProvider _provider;
    private readonly int Id;
    
    public A(IServiceProvider provider)
    {
        _provider = provider;
        Id = (provider.GetService(typeof(IParameterService)) as ParameterService).APara;
    }
    public int methodA()
    {
        return Id+1;
    }      

}
public class B : IB
{
    private readonly IServiceProvider _provider;
    
    public B(IServiceProvider provider)
    {
        _provider = provider;
    }
    public int methodB()
    {
        return (_provider.GetService(typeof(IA)) as A).methodA();
    }
}
public class C : IC
{
    private readonly IServiceProvider _provider;
    
    public C(IServiceProvider provider)
    {
        _provider = provider;
    }
    public int methodC()
    {
        return (_provider.GetService(typeof(IB)) as B).methodB();
    }
}

啟動時:

services.AddTransient<IParameterService>(x => new ParameterService(1));
            services.AddTransient<IA,A>();
            services.AddTransient<IB,B>();
            services.AddTransient<IC, C>();

在 controller 中:

    private readonly A _A;
    private readonly C _C;
    public SomeController(IServiceProvider provider)
    {
       
        _A = (A)provider.GetService(typeof(IA));
        _C=(C)provider.GetService(typeof(IC));
    }

結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM