返回

.NET Core在program.cs里GetService获取服务实例

2024-04-17 .NET .NET Core program.cs GetService 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.”

.NET Core在program.cs里GetService获取服务实例

根据微软官方文档里推荐的做法是这样的:

在应用启动时解析服务

以下代码显示如何在应用启动时限时解析范围内服务:

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 等主流编程工具, 为你提供高效、流畅、舒心的智能编码体验!

DOVE 网络加速器 梯子 免费 试用

顶部