gpt4 book ai didi

c# - 如何在 ASP.NET Core 3.1 中获取服务实例

转载 作者:行者123 更新时间:2023-12-03 16:03:06 24 4
gpt4 key购买 nike

我在 .NET Core 2.0 中有一个小项目,随着 Microsoft 宣布不再支持 .NET Core 2.0,我尝试将项目更新到此时的最新版本是 3.1。但是我很难配置依赖注入(inject)并且需要一些帮助。

为了填充数据库,我需要获取所需的服务,例如 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 .并尝试将数据库迁移到最新状态。

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

最后,在你的启动过程中使用extend方法。像这样:

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

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

当您执行其他 efdotnet ef migrations add Test 这样的命令并且脚本不会被执行。你的数据库还是一样的。

希望这可以帮助。

关于c# - 如何在 ASP.NET Core 3.1 中获取服务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59774559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com