首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有私有NuGet包的Blazor依赖注入和EF/DbContext

带有私有NuGet包的Blazor依赖注入和EF/DbContext
EN

Stack Overflow用户
提问于 2021-10-24 05:36:28
回答 1查看 168关注 0票数 0

我正在尝试设置一个Blazor项目,以便通过许多其他项目进行可重用,并且我在理解Blazor的DI系统如何与NuGet包一起工作时遇到了问题。

简而言之,我构建了一个简单的Blazor应用程序,作为bug报告/请求的票务系统。它通过输入表单(作为组件构建)收集简单信息,并通过实体框架和连接字符串(存储在AppSettings.JSON中)将票证上载到Server数据库。DbContext通过AddDbContextFactory注入到票务应用的DI系统中。这一切在解决方案中都是完美的。

我的目标是:我想打包这个票务系统,并在我的其他应用程序中重复使用它。在其他应用程序中,我想重用"AddTicket“组件,它只接受一些简单的报告数据并更新票务数据库。

作为一个测试,我在我的机器上将票务应用打包成一个本地的NuGet包。我把它导入了一个单独的主机应用程序。但是,我必须在主机应用程序中重新创建连接字符串和依赖项注入(包括上下文工厂和所有内容),才能使包正常工作。

我的问题是,当我构建自己的NuGet包时,我不理解Blazor的DI系统是如何工作的,我也不理解Startup.cs中的依赖注入流程和NuGet包中的依赖注入流程。

我只是一个简单的、可重用的表单和提交组件,所有的EF和数据库逻辑都是以最简单的方式内置到其中,这样我就可以进入十几个外部项目。

构建NuGet包的最佳方法是什么,这样我就不需要在这种情况下进行额外的依赖注入了?如果我必须在主机应用的DI系统中做一个额外的输入,我如何使它尽可能简单?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-24 06:55:42

当我创建一个有注入的库时。在我的库中,我为IServiceCollection创建了一个静态类以及创建和扩展方法。

代码语言:javascript
复制
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

代码语言:javascript
复制
public partial class SyncDatabaseBroker : DbContext, ISyncDatabaseBroker

这使得用户更容易在他们的代码库中安装。必须对数据库进行稍微不同的处理。当我想管理迁移或共享连接字符串时,我使用以下方法:

Program.cs (图书馆消费服务器)

代码语言:javascript
复制
...
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();

然后,我可以使用控制台命令进行迁移:

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69694142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档