[英]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.