日安。我有一个理解依赖注入的问题。
那么,我到底需要的是从子对象到父对象的访问。例如,我有我的MainProgram对象。这个对象创建另一个对象,另一个对象创建三维对象,等等。让我们停止讨论子对象#5
这个子对象需要对对象#1有一个引用。
我不知道怎么用更好的方式来做这件事。但后来我开始搜索并找到一个叫做依赖注入的东西。
我真的希望这件事是我的问题的正确答案(如果不是,请告诉我)。
所以在这里我的问题和例子。我正在尝试为我的服务创建一个WEB。使用ASP .NET Core 6
首先,我创建了一个简单的类,它将是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();
   }
}然后,我将这个类添加到Program.cs中以表示依赖性。
builder.Services.AddSingleton(program => new MainProgram(1000));我为我的控制器创建了一个构造函数,就像我读过的示例中的一样,它们都工作得很好。
控制器自己创建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的链接。我以为这就是依赖注入有帮助的地方。
的主要问题是
如果我不能编写MainProgram,如何创建具有依赖于new TestOperation(WITHOUT ATTRIBUTE)的构造函数的对象?这将是一个语法错误。
发布于 2022-09-16 06:40:41
我认为你会避免依赖的循环;
如果无法避免,可以尝试将IServiceProvider注入到服务中,并使用provider.GetService()方法获取目标服务,还可以尝试创建参数服务或静态类来保存所需的参数,我尝试如下:
服务:
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>();在主计长:
    private readonly A _A;
    private readonly C _C;
    public SomeController(IServiceProvider provider)
    {
       
        _A = (A)provider.GetService(typeof(IA));
        _C=(C)provider.GetService(typeof(IC));
    }结果:

https://stackoverflow.com/questions/73739756
复制相似问题