如何在ASP.NET Core 3.1中获取服务的实例 [英] How do I get a instance of a service in ASP.NET Core 3.1
本文介绍了如何在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屋!
查看全文