管理具有多个层的项目中的配置的方法

时间:2018-06-07 13:50:33

标签: c# asp.net-core .net-core entity-framework-core

ASP.NET核心项目模板随appsettings.jsonappsettings.Development.json一起提供,默认情况下会在CreateDefaultBuilder中添加。

因为DbContext的项目与我的ASP.NET核心项目(MyProject.Data)是分开的,所以我需要为我的上下文实现IDesignTimeDbContextFactory以便命令Add-MigrationUpdate-Database工作。我不想为我的IDesignTimeDbContextFactory硬编码我的连接字符串,但在两个项目中重新使用配置。

我的解决方案很少,但我想根据您的经验和意见了解最合理的解决方案。

  • 在我的ASP.NET核心(UI层)项目中实现IDesignTimeDbContextFactory
  • 在我的IDesignTimeDbContextFactory项目中实施MyProject.Data,并将appsettings.json移动到项目之间共享的某个根目录或configuration(位于根目录)目录。
  • database.json数据库创建单独的配置文件,将其与我的.sln文件放在一起。

我该如何分享?

编辑:

这里有类似的问题和答案:ConnectionString from appsettings.json in Data Tier with Entity Framework Core但它没有回答我的问题。根本没有关于数据层的任何内容。我不想重新使用逻辑来添加db上下文。 我想在两个项目中重复使用连接字符串,以避免重复连接字符串。

2 个答案:

答案 0 :(得分:2)

虽然通常建议在中心位置进行配置,但没有什么限制单个项目管理自己的配置。

在以下示例中,连接字符串信息存储在外部 datasettings.json 文件中

{
  "ConnectionStrings": {
    "DefaultConnection": "connection string here"
  }
}

图层的自包含设置扩展的简单示例可能类似于

public static class MyServiceCollectionExtensions {
    public static IServiceCollection AddMyDataLayer(this IServiceCollection services, string name = "DefaultConnection") {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("datasettings.json"); //<<< just an example

        var connectionStringConfig = builder.Build();

        services
            .AddEntityFrameworkSqlServer()
            .AddDbContext<YourDbContext>((serviceProvider, options) =>
                options
                    .UseSqlServer(connectionStringConfig.GetConnectionString(name))
            );
         return services;
    }
}

并添加到启动

using my.data.layer;

//...

public void ConfigureServices(IServiceCollection services) {

    //...

    services.AddMyDataLayer();

    //...
}

在这种情况下,数据层管理自己的配置。其设置文件位于应用程序设置外部。

还有扩展的空间,因为其他选项也可以在本地进行管理,并且适用于插入式密钥插件解决方案。

Configuration in ASP.NET Core的模块性质允许这种灵活性。

答案 1 :(得分:0)

我对这个主题的看法/意见:

使用您的DbContext(如API / Backend / Frontend)在每个顶层应用程序中使用连接String,因为它们可以在不同的服务器上运行。所以他们应该有自己的设置文件。

要在没有连接字符串的情况下处理来自库的迁移,您可以使用以下方法:

cd /projectWithContextImpl

dotnet ef -s "../projectWithConnString/" migrations list -c NameOfContext

我希望这有点回答你的问题。