Blazor 依赖注入和 EF/DbContext 私有 NuGet 包
Blazor dependency injection and EF/DbContext with private NuGet packages
我正在尝试设置一个 Blazor 项目以通过许多其他项目重复使用,但我在理解 Blazor 的 DI 系统如何与 NuGet 包一起工作时遇到问题。
简而言之,我构建了一个简单的 Blazor 应用程序作为错误 reports/requests 的票务系统。它通过输入表单(构建为组件)收集简单信息,并通过 Entity Framework 和连接字符串(存储在 AppSettings.JSON 中)将票据上传到 SQL 服务器数据库。 DbContext 通过 AddDbContextFactory 注入票务应用程序的 DI 系统。这一切都在解决方案中完美运行。
我的目标是:我想打包这个票务系统并以最少的设置在我的其他应用程序中重复使用它。在其他应用程序中,我想重用“AddTicket”组件,它只接受一些简单的报告数据并更新票务数据库。
作为测试,我将票务应用打包为本地计算机上的 NuGet 包。我将它导入到一个单独的主机应用程序中。但是,我必须在主机应用程序中重新创建连接字符串和依赖项注入(使用上下文工厂和所有内容)才能使程序包正常工作。
我的问题是,当我构建自己的 NuGet 包时,我不明白 Blazor 的 DI 系统是如何工作的,而且我不明白 Startup.cs 中的依赖注入流程与 Startup.cs 中的依赖注入流程NuGet 包。
我只是一个简单的、可重用的表单和提交组件,以最简单的方式内置了所有 EF 和数据库逻辑,我可以将其放入十几个外部项目中。
构建 NuGet 包的最佳方法是什么,这样我就不需要在这种情况下进行额外的依赖项注入?如果我必须在主机应用程序的 DI 系统中做一个额外的入口,我该如何让它尽可能简单?
当我创建一个有注入的库时。在我的库中,我创建了一个静态 class 并为 IServiceCollection
创建和扩展方法
public static class ServiceCollectionExtensions
{
public static void AddBlazorSyncServer(this IServiceCollection services)
{
services.AddScoped<ILogger, Logger<LoggingBroker>>();
services.AddScoped<ILoggingBroker, LoggingBroker>();
services.AddScoped<IDateTimeBroker, DateTimeBroker>();
services.AddTransient<ISyncDatabaseBroker, SyncDatabaseBroker>();
...
}
}
注意:在我的示例中 SyncDatabaseBroker
是 DbContext
:
public partial class SyncDatabaseBroker : DbContext, ISyncDatabaseBroker
这使得用户在他们的代码库中进行设置变得更加容易。
数据库必须以不同的方式处理。当我想管理迁移或共享连接字符串时,我使用这种方法:
Program.cs
(库消费服务器)
...
var migrationsAssembly = typeof(Program).Assembly.FullName;
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer(
connectionString,
dbOpts => dbOpts.MigrationsAssembly(migrationsAssembly)));
builder.Services.AddDbContext<SyncDatabaseBroker>(
options => options.UseSqlServer(
connectionString,
dbOpts => dbOpts.MigrationsAssembly(migrationsAssembly)));
...
builder.Services.AddBlazorSyncServer();
然后我可以用于迁移的控制台命令:
Add-Migration InitialApplicationSchema -Context ApplicationDbContext -OutputDir Data/Migrations/Application
Add-Migration InitialSyncSchema -Context SyncDatabaseBroker -OutputDir Data/Migrations/Sync
Update-Database -Context ApplicationDbContext
Update-Database -Context SyncDatabaseBroker
我正在尝试设置一个 Blazor 项目以通过许多其他项目重复使用,但我在理解 Blazor 的 DI 系统如何与 NuGet 包一起工作时遇到问题。
简而言之,我构建了一个简单的 Blazor 应用程序作为错误 reports/requests 的票务系统。它通过输入表单(构建为组件)收集简单信息,并通过 Entity Framework 和连接字符串(存储在 AppSettings.JSON 中)将票据上传到 SQL 服务器数据库。 DbContext 通过 AddDbContextFactory 注入票务应用程序的 DI 系统。这一切都在解决方案中完美运行。
我的目标是:我想打包这个票务系统并以最少的设置在我的其他应用程序中重复使用它。在其他应用程序中,我想重用“AddTicket”组件,它只接受一些简单的报告数据并更新票务数据库。
作为测试,我将票务应用打包为本地计算机上的 NuGet 包。我将它导入到一个单独的主机应用程序中。但是,我必须在主机应用程序中重新创建连接字符串和依赖项注入(使用上下文工厂和所有内容)才能使程序包正常工作。
我的问题是,当我构建自己的 NuGet 包时,我不明白 Blazor 的 DI 系统是如何工作的,而且我不明白 Startup.cs 中的依赖注入流程与 Startup.cs 中的依赖注入流程NuGet 包。
我只是一个简单的、可重用的表单和提交组件,以最简单的方式内置了所有 EF 和数据库逻辑,我可以将其放入十几个外部项目中。
构建 NuGet 包的最佳方法是什么,这样我就不需要在这种情况下进行额外的依赖项注入?如果我必须在主机应用程序的 DI 系统中做一个额外的入口,我该如何让它尽可能简单?
当我创建一个有注入的库时。在我的库中,我创建了一个静态 class 并为 IServiceCollection
public static class ServiceCollectionExtensions
{
public static void AddBlazorSyncServer(this IServiceCollection services)
{
services.AddScoped<ILogger, Logger<LoggingBroker>>();
services.AddScoped<ILoggingBroker, LoggingBroker>();
services.AddScoped<IDateTimeBroker, DateTimeBroker>();
services.AddTransient<ISyncDatabaseBroker, SyncDatabaseBroker>();
...
}
}
注意:在我的示例中 SyncDatabaseBroker
是 DbContext
:
public partial class SyncDatabaseBroker : DbContext, ISyncDatabaseBroker
这使得用户在他们的代码库中进行设置变得更加容易。 数据库必须以不同的方式处理。当我想管理迁移或共享连接字符串时,我使用这种方法:
Program.cs
(库消费服务器)
...
var migrationsAssembly = typeof(Program).Assembly.FullName;
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer(
connectionString,
dbOpts => dbOpts.MigrationsAssembly(migrationsAssembly)));
builder.Services.AddDbContext<SyncDatabaseBroker>(
options => options.UseSqlServer(
connectionString,
dbOpts => dbOpts.MigrationsAssembly(migrationsAssembly)));
...
builder.Services.AddBlazorSyncServer();
然后我可以用于迁移的控制台命令:
Add-Migration InitialApplicationSchema -Context ApplicationDbContext -OutputDir Data/Migrations/Application
Add-Migration InitialSyncSchema -Context SyncDatabaseBroker -OutputDir Data/Migrations/Sync
Update-Database -Context ApplicationDbContext
Update-Database -Context SyncDatabaseBroker