【问题标题】:.NET 6 - Inject service into program.cs.NET 6 - 将服务注入 program.cs
【发布时间】:2022-11-22 04:33:48
【问题描述】:

我知道如何在 .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
    }
}

我如何在 .NET 6 中实现这一点?

【问题讨论】:

    标签: c# .net class dependency-injection startup


    【解决方案1】:

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

    WebApplication? app = builder.Build();
    
    var someService = app.Services.GetService<SomeService>();
    
    someService.DoSomething();
    

    【讨论】:

    • 任何机会得到它们builder.Build()
    • 我不知道是否可能
    【解决方案2】:

    您将服务添加到 builder.Services 集合,然后使用

    var myService = services.BuildServiceProvider().GetService<MyService>();
    

    【讨论】:

    • 如果 MyService 有范围,则可以使用 CreateScope() 创建一个范围。
    • @Tvde1 说的对
    • var myService = services.BuildServiceProvider().CreateScope().ServiceProvider.GetRequiredService&lt;MyService&gt;(); 如果我没记错的话
    • @MaartenVissers 这无疑在其他地方得到了回答,但这并非不重要,因此只需在您首选的搜索引擎中查找范围内的服务即可。
    • 所以真的不推荐调用BuildServiceProvider。它会创建额外的单例服务副本。
    【解决方案3】:

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

    比如我在Singleton模式和Scoped的基础上添加了DbContext和两个不同的服务

    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>();
    

    有关更多信息,请查看Code samples migrated to the new minimal hosting model in ASP.NET Core 6.0

    【讨论】:

      【解决方案4】:

      我尝试使用 GetService 方法,但我将服务接口类型作为输入传递(如下所示),这对我有用。

      var app = builder.Build();    
      var injectedService1 = app.Services.GetService<IToInjectService>();
      injectedService1.DoSomething();
      

      【讨论】:

        【解决方案5】:

        如果您需要在开始时使用范围服务,这就是您的方式程序.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();
        

        从: Resolve a service at app start up

        它确实适用于 mi DbInitializer

        【讨论】:

          猜你喜欢
          • 2023-01-21
          • 2022-11-02
          • 2022-11-09
          • 1970-01-01
          • 2019-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多