首页 > 解决方案 > 显式实例化使用 DI 的 C# 类 - 为什么它不起作用?

问题描述

我正在使用 ASP.NET Core Web API。我很难集中精力实例化一个使用 DI 的非控制器类。有很多与此相关的 SO 文章,但没有一个回答我的问题(据我所知)。这些是最受欢迎和相关的:

非控制器的网络核心依赖注入

没有控制器的依赖注入

ASP.NET 5 非控制器 DI 注入

我的用例(一个人为的例子):

我有SpeechWriter一个依赖于的类IRandomTextService

public class SpeechWriter
{
    private readonly IRandomTextService _textService;
    
    // Constructor with Text Service DI
    public SpeechWriter(IRandomTextService textService)
    {
        _textService = textService;
    }

    public string WriteSpeech()
    {
        var speech = _textService.GetText(new Random().Next(5,50));

        return speech;
    }
}

IRandomTextService界面:

public interface IRandomTextService
{
    public string GetText(int wordCount);
}

和实施:

public class RandomTextService : IRandomTextService
{
    public string GetText(int wordCount)
    {
        return Lorem.Words(wordCount);
    }
}

IRandomTextService在以下位置注册为服务Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddScoped<IRandomTextService, RandomTextService>();
}

在我的控制器操作中,如果我想实例化SpeechWriter这样的:

public IActionResult Index()
{
    var speech = new SpeechWriter();

    return Ok(speech.WriteSpeech());
}

我不能这样做,因为需要一个参数(注入的服务)。

SpeechWriter 需要 RandomTextService 作为参数

我似乎可以让 DI 注入的唯一方法RandomTextServiceSpeechWriter,如果SpeechWriter它本身是一个服务并注入到控制器中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddScoped<IRandomTextService, RandomTextService>();
    services.AddScoped<SpeechWriter>();
}
public class EchoController : ControllerBase
{
    private readonly SpeechWriter _speechWriter;
    
    public EchoController(SpeechWriter speechWriter)
    {
        _speechWriter = speechWriter;
    }
    
    
    public IActionResult Index()
    {
        return Ok(_speechWriter.WriteSpeech());
    }
}

在我的第一个示例中实例化时,有什么方法可以RandomTextService注入,像这样?SpeechWriter

var speech = new SpeechWriter();

如果不是,那么我缺少的 DI 是什么?我的实际应用程序比这更复杂,我实际上必须创建一个 DI 链和服务链,一直到控制器。我可以使用ServiceProvider“反模式”,但我不想那样做,因为我会ServiceProvider到处乱跑。

请帮助教育我!

谢谢。

标签: c#asp.net-coredependency-injectionasp.net-core-webapi

解决方案


推荐阅读