c# - 显式实例化使用 DI 的 C# 类 - 为什么它不起作用?
问题描述
我正在使用 ASP.NET Core Web API。我很难集中精力实例化一个使用 DI 的非控制器类。有很多与此相关的 SO 文章,但没有一个回答我的问题(据我所知)。这些是最受欢迎和相关的:
我的用例(一个人为的例子):
我有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());
}
我不能这样做,因为需要一个参数(注入的服务)。
我似乎可以让 DI 注入的唯一方法RandomTextService
是SpeechWriter
,如果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
到处乱跑。
请帮助教育我!
谢谢。
解决方案
推荐阅读
- python - 抓取亚马逊工作结果时不断收到连接重置错误 10054
- entity-framework - ExecuteStoreCommand "Delete" 将不同的记录计数返回到 "DeleteObject" 删除后,为什么?
- javascript - 使用 graphql-ruby 生成 schema.json
- python - 如何设置 Python 交互窗口的字体?
- laravel - 保存前如何根据其他字段值设置字段值
- c - 在不同类型的变量之间分配共享内存时出现分段错误
- reactjs - 开发服务器使用 HTTPS 和 localhost 时未加载源映射
- javascript - 使用 express 验证器验证 req.params
- openssl - gitlab-runner x509:由未知权威签署的证书
- javascript - 如何用一些按钮显示图像?