首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制器外部的依赖注入

控制器外部的依赖注入
EN

Stack Overflow用户
提问于 2022-09-16 04:06:09
回答 1查看 157关注 0票数 0

日安。我有一个理解依赖注入的问题。

那么,我到底需要的是从子对象到父对象的访问。例如,我有我的MainProgram对象。这个对象创建另一个对象,另一个对象创建三维对象,等等。让我们停止讨论子对象#5

这个子对象需要对对象#1有一个引用。

我不知道怎么用更好的方式来做这件事。但后来我开始搜索并找到一个叫做依赖注入的东西。

我真的希望这件事是我的问题的正确答案(如果不是,请告诉我)。

所以在这里我的问题和例子。我正在尝试为我的服务创建一个WEB。使用ASP .NET Core 6

首先,我创建了一个简单的类,它将是MainProgram,当服务器接收包含所需数据的POST请求时,它将启动一些多线程工作。

代码语言:javascript
运行
复制
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中以表示依赖性。

代码语言:javascript
运行
复制
builder.Services.AddSingleton(program => new MainProgram(1000));

我为我的控制器创建了一个构造函数,就像我读过的示例中的一样,它们都工作得很好。

控制器自己创建MainProgram实例。

代码语言:javascript
运行
复制
[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}";
  }
}

我遇到的问题就在这条线上

代码语言:javascript
运行
复制
TestOperation to = new TestOperation(_mainProgram);

TestOperation还具有来自MainProgram的依赖项。我知道我可以在里面传递我的私人_mainProgram

但是让我们假设TestOperation也有一个孩子,这个孩子也有一个孩子,而第三个孩子只需要一个指向MainProgram的链接。我以为这就是依赖注入有帮助的地方。

的主要问题是

如果我不能编写MainProgram,如何创建具有依赖于new TestOperation(WITHOUT ATTRIBUTE)的构造函数的对象?这将是一个语法错误。

EN

回答 1

Stack Overflow用户

发布于 2022-09-16 06:40:41

我认为你会避免依赖的循环;

如果无法避免,可以尝试将IServiceProvider注入到服务中,并使用provider.GetService()方法获取目标服务,还可以尝试创建参数服务或静态类来保存所需的参数,我尝试如下:

服务:

代码语言:javascript
运行
复制
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();
    }
}

在启动时:

代码语言:javascript
运行
复制
services.AddTransient<IParameterService>(x => new ParameterService(1));
            services.AddTransient<IA,A>();
            services.AddTransient<IB,B>();
            services.AddTransient<IC, C>();

在主计长:

代码语言:javascript
运行
复制
    private readonly A _A;
    private readonly C _C;
    public SomeController(IServiceProvider provider)
    {
       
        _A = (A)provider.GetService(typeof(IA));
        _C=(C)provider.GetService(typeof(IC));
    }

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73739756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档