.NET 6 - 将服务注入program.cs

Maa*_*ers 32 .net c# dependency-injection class startup

我知道如何在 .NET 5(或之前版本)的 Startup.cs 中进行依赖项注入,但是如何对 .NET 6 中的顶级 Program.cs 执行相同的操作?

.NET 5:例如,我可以在Configure方法中注入一个类

public class Startup
{
    public IConfiguration _configuration { get; }
    public IWebHostEnvironment _env { get; set; }

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        _configuration = configuration;
        _env = env;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // TODO
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IToInjectService serviceToInject)
    {
        // USE SERVICE
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在 .NET 6 中实现这一目标?

Edu*_*_LG 47

使用 .Net 6 很容易。只需在配置应用程序服务并运行 Build 方法后执行 GetService 方法即可。

WebApplication? app = builder.Build();

var someService = app.Services.GetService<ISomeService>();

someService.DoSomething();
Run Code Online (Sandbox Code Playgroud)

  • 有机会在“builder.Build()”之前获得它们吗? (5认同)

Wim*_*ets 17

您将服务添加到builder.Services集合中,然后使用以下命令访问它

var myService = services.BuildServiceProvider().GetService<MyService>();
Run Code Online (Sandbox Code Playgroud)

  • 所以真的不建议调用BuildServiceProvider。它创建单例服务的附加副本。 (4认同)
  • `var myService = services.BuildServiceProvider().CreateScope().ServiceProvider.GetRequiredService&lt;MyService&gt;();` 如果我没记错的话 (2认同)

小智 15

如果您需要在启动时使用范围服务,则您的program.cs应如下所示:

var builder = WebApplication.CreateBuilder(args);

//Add the service
builder.Services.AddScoped<IMyDependency, MyDependency>();

var app = builder.Build();

using (var serviceScope = app.Services.CreateScope())
{
    var services = serviceScope.ServiceProvider;

    var myDependency = services.GetRequiredService<IMyDependency>();

    //Use the service
    myDependency.DoSomething();

}

app.Run();
Run Code Online (Sandbox Code Playgroud)

来自: 在应用程序启动时解析服务

它确实适用于 mi DbInitializer


Rez*_*ari 5

在文件中,program.cs您可以通过以下方式管理您的服务builder.Services

例如,我添加了 DbContext 和基于 Singleton 模式和 Scoped 的两个不同服务

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddDbContext<MyDbContext>(options =>
{
    // options.UseSqlServer(...);
});
builder.Services.AddSingleton<IMyService, MyService>();
builder.Services.AddScoped<IMySessionBasedService, MySessionBasedService>();
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请查看迁移到 ASP.NET Core 6.0 中新的最小托管模型的代码示例