如何在ASP.NET Core 3.1中获取服务的实例 [英] How do I get a instance of a service in ASP.NET Core 3.1

查看:0
本文介绍了如何在ASP.NET Core 3.1中获取服务的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在.NET Core2.0中有一个小项目,当微软宣布将不再支持.NET Core2.0时,我试图将该项目更新到目前的最新版本3.1。但我在配置依赖项注入时遇到了困难,需要一些帮助。

为了填充数据库,我需要获取所需的服务,如DB上下文和用户配置,并将其传递给DbInitialize类,如下所示。在Startup.cs配置之前,我在Program.cs中完成了此操作。

public class Program {
        public static void Main(string[] args)
        {

            var host = BuildWebHost(args);

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var context = services.GetRequiredService<GameStoreContext>();
                    var configuration = services.GetRequiredService<IConfiguration>();
                    var userManager = services.GetRequiredService<UserManager<IdentityUser>>();
                    var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
                    DbInitializer.Initialize(context, configuration, userManager,roleManager).GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }
            host.Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .Build();
    }

但在.NET Core 3.1版本中,无法再实例化BuildWebHost,因此我无法检索这样的服务。

.NET Core 3.1中的新版本Program.cs如下所示

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

我有什么方法可以在新的框架中实现相同的结果吗?

OBS:我在一些帖子中看到有人建议使用IConfiguration,但我找不到任何示例。

推荐答案

我知道您想要获取DBContext的实例。并用它执行一些代码。在这里,我将为您提供一个在ASP.NET Core 3.1启动期间自动设定数据库种子的示例。您可以尝试以下代码或尝试解决问题的方法。

首先,将以下代码复制到您的项目中:

public static IHost MigrateDbContext<TContext>(this IHost host) where TContext : DbContext
{
    // Create a scope to get scoped services.
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var logger = services.GetRequiredService<ILogger<TContext>>();
        // get the service provider and db context.
        var context = services.GetService<TContext>();

        // do something you can customize.
        // For example, I will migrate the database.
        context.Database.Migrate();
    }

    return host;
}
它为Ihost创建了一个扩展方法,允许您在应用程序启动后自动升级数据库。它使用您的应用程序的默认服务提供商创建一个作用域并获取您的DBContext。并尝试将数据库迁移到最新状态。

如果您的数据库为空或根本不存在,该脚本还可以自动创建您的数据库。

最后,在您的启动过程中使用Extended方法。如下所示:

public static void Main(string[] args)
{
    CreateHostBuilder(args)
        .Build()
        .MigrateDbContext<WikiDbContext>() // <-- call it here like this.
        .Run();
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}

尝试启动您的应用程序,并监视它是否可以成功执行更新进程。

当您执行其他ef命令(如dotnet ef migrations add Test)时,脚本将不会执行。您的数据库仍然是相同的。

希望这能有所帮助。

这篇关于如何在ASP.NET Core 3.1中获取服务的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆