返回
.NET Core在program.cs里GetService获取服务实例
2024-04-17
824 0在.NET Core MVC中,你可以使用依赖注入(DI)来获取服务。依赖注入是一种设计模式,它允许我们将服务的创建和管理与其使用解耦,使得代码更加可测试、可维护和可扩展。
在.NET Core MVC中,依赖注入容器负责管理应用程序中的服务。首先在program.cs里注册服务:
builder.Services.AddScoped<IArticleService, ArticleService>();
可以通过以下方式在控制器、视图或其他组件中获取服务:
public class MyController : Controller
{
private readonly IArticleService _articleService;
public MyController(IArticleService articleService)
{
_articleService = articleService;
}
// 在其他方法中使用 _articleService
}
在某些情况下,可能需要在没有构造函数或方法参数的地方获取服务。可以通过 HttpContext 的 RequestServices 属性来获取服务。例如:
var articleService = HttpContext.RequestServices.GetService<IArticleService>();
但是如果想要在program.cs里获取服务呢?假如我想在app.Run()执行前获取服务实例,调用服务的某个方法,一开始代码是这样的:
var articleService = app.Services.GetService<IArticleService>();
articleService.Method(); // 执行service的某个方法
app.Run();
这段代码执行会报错:
未经处理的异常:
System.InvalidOperationException:“Cannot resolve scoped service 'YBlog.Services.IArticleService' from root provider.”
根据微软官方文档里推荐的做法是这样的:
在应用启动时解析服务
以下代码显示如何在应用启动时限时解析范围内服务:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IMyDependency, MyDependency>();
var app = builder.Build();
using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var myDependency = services.GetRequiredService<IMyDependency>();
myDependency.WriteMessage("Call services from main");
}
app.Run();
这样就能在program.cs里的app.Run()之前成功地获取服务实例然后执行服务的方法了。
您可能感兴趣:
阿里云 云服务器 99元1年 2核2G 3M固定带宽 续费与新购同价
领取 通义灵码 免费使用资格 兼容 Visual Studio Code、Visual Studio、JetBrains IDEs 等主流编程工具, 为你提供高效、流畅、舒心的智能编码体验!
网友点评
提交