rea*_*kep 6 c# dependency-injection asp.net-core asp.net-core-webapi
我正在使用 ASP.NET Core Web API。我很难实例化一个使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
IRandomTextService
界面:
public interface IRandomTextService
{
public string GetText(int wordCount);
}
Run Code Online (Sandbox Code Playgroud)
和实施:
public class RandomTextService : IRandomTextService
{
public string GetText(int wordCount)
{
return Lorem.Words(wordCount);
}
}
Run Code Online (Sandbox Code Playgroud)
IRandomTextService
已在以下位置注册为服务Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IRandomTextService, RandomTextService>();
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器操作中,如果我想实例化SpeechWriter
这样的:
public IActionResult Index()
{
var speech = new SpeechWriter();
return Ok(speech.WriteSpeech());
}
Run Code Online (Sandbox Code Playgroud)
我不能这样做,因为需要一个参数(注入的服务)。
我似乎可以让 DI 注入的唯一方法RandomTextService
是SpeechWriter
它SpeechWriter
本身是一个服务并注入到控制器中:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IRandomTextService, RandomTextService>();
services.AddScoped<SpeechWriter>();
}
Run Code Online (Sandbox Code Playgroud)
public class EchoController : ControllerBase
{
private readonly SpeechWriter _speechWriter;
public EchoController(SpeechWriter speechWriter)
{
_speechWriter = speechWriter;
}
public IActionResult Index()
{
return Ok(_speechWriter.WriteSpeech());
}
}
Run Code Online (Sandbox Code Playgroud)
像我的第一个示例中那样实例化RandomTextService
时,有什么方法可以注入吗?SpeechWriter
var speech = new SpeechWriter();
Run Code Online (Sandbox Code Playgroud)
如果不是,那么我缺少 DI 的什么内容?我的实际应用程序比这更复杂,我实际上必须创建一条 DI 和服务链,一直返回到控制器。我可以使用ServiceProvider
“反模式”,但我不想这样做,因为我会ServiceProvider
到处走走。
请大家帮忙赐教!
谢谢。
归档时间: |
|
查看次数: |
1359 次 |
最近记录: |