我希望有人可以帮助一个相当新的程序员。
我有 Blazor 应用 我有一个控制台应用程序 我有一个班级图书馆
类库包含 Blazor 应用程序和控制台应用程序要访问的所有模型和服务。 Blazor 应用程序工作正常,通过在启动时创建服务,即
builder.Services.AddDbContextFactory<ASNDBContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
blazor 应用程序使用 IDbContextFactory 来访问数据库。共享库中的服务都使用这个IDbContextFactory。
例如,在共享库中,我有以下方法:
public async Task<ReceiptHeader> GetReceiptHeadersAsync(int id)
{
using var context = factory.CreateDbContext();
return await context.ReceiptHeaders.Where(p => p.Superseeded == false).FirstOrDefaultAsync(p => p.Id == id);
}
Blazor 应用程序做得很好,因为 DI 已填充 IDbContextFactory,但是据我所知,我无法从控制台应用程序使用 IDbContextFactory。
有没有办法解决这个问题,或者有办法创建一个新的 dbcontext 并由此创建一个 DbContextFactory ?
我尝试手动创建 IDbContextFactory,但是我在 myDbContext 和 IDBContextFactory 之间遇到转换问题
您可以复制设置或在控制台应用程序中创建类似的设置。至少有以下几种选择:
var services = new ServiceCollection();
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json") // add the rest of config sources
.AddEnvironmentVariables()
.Build();
services.AddDbContextFactory<>(...);
var serviceProvider = services.BuildServiceProvider();
using (var scope = serviceProvider.CreateScope())
{
var ctxFactory = scope.ServiceProvider.GetRequiredService<IDBContextFactory<...>>();
}
不要忘记添加所有必需的软件包(EF、
Microsoft.Extensions.DependencyInjection
)。
Microsoft.Extensions.Hosting
nuget,这种方法实际上用在worker services模板中):IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddDbContextFactory<>(...);
services.AddHostedService<Worker>(); // move your app logic into hosted service
})
.Build();
host.Run();