在控制台应用程序中重用 IDbContextFactory

问题描述 投票:0回答:1

我希望有人可以帮助一个相当新的程序员。

我有 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 之间遇到转换问题

c# entity-framework-core blazor
1个回答
1
投票

您可以复制设置或在控制台应用程序中创建类似的设置。至少有以下几种选择:

  1. 手动创建相应的基础设施:
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
)。

  1. 使用通用托管
    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();
© www.soinside.com 2019 - 2024. All rights reserved.