如何在ASP.NET Core 3.1中获取服务的实例

发布时间:2022-09-20 / 作者:清心寡欲
本文介绍了如何在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();
                    var configuration = services.GetRequiredService();
                    var userManager = services.GetRequiredService>();
                    var roleManager = services.GetRequiredService>();
                    DbInitializer.Initialize(context, configuration, userManager,roleManager).GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }
            host.Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup()
                .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();
            });
}

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

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

推荐答案

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

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

public static IHost MigrateDbContext(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>();
        // get the service provider and db context.
        var context = services.GetService();

        // 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() // <-- call it here like this.
        .Run();
}

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

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

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

希望这能有所帮助。

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



[英文标题]How do I get a instance of a service in ASP.NET Core 3.1


声明:本媒体部分图片、文章来源于网络,版权归原作者所有,如有侵权,请联系QQ:330946442删除。