如何管理具有多个层的项目中的配置

Kon*_*rad 11 c# entity-framework-core .net-core asp.net-core

ASP.NET Core项目模板随附,appsettings.json并且appsettings.Development.json默认情况下会在CreateDefaultBuilder中添加.

由于该项目DbContext是从我的ASP.NET核心项目分开(MyProject.Data),我必须执行IDesignTimeDbContextFactory,以便我的上下文像命令Add-MigrationUpdate-Database工作.我不想硬编码我的连接字符串,IDesignTimeDbContextFactory但在两个项目中重新使用配置.

我的解决方案很少但我想知道根据你的经验和意见最合理的是什么.

  • 落实IDesignTimeDbContextFactory在我的ASP.NET核心(UI层)项目.
  • IDesignTimeDbContextFactory在我的MyProject.Data项目中实现,并移动appsettings.jsonconfiguration项目之间共享的某个根目录或(位于根目录)目录.
  • 为数据库创建单独的配置文件,例如database.json将其放在我的.sln文件旁边.

我该如何分享?

编辑:

这里有类似的问题和答案:数据层中的appsettings.json与实体框架核心的ConnectionString,但它没有回答我的问题.根本没有关于数据层的任何内容.我不想重新使用逻辑来添加db上下文.我想在两个项目中重用连接字符串,以避免重复连接字符串.

Nko*_*osi 3

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

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

{
  "ConnectionStrings": {
    "DefaultConnection": "connection string here"
  }
}
Run Code Online (Sandbox Code Playgroud)

该层的自包含设置扩展的一个简单示例可能如下所示

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并在启动中添加

using my.data.layer;

//...

public void ConfigureServices(IServiceCollection services) {

    //...

    services.AddMyDataLayer();

    //...
}
Run Code Online (Sandbox Code Playgroud)

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

存在扩展空间,因为其他选项也可以在本地管理,并且适用于例如即插即用的插件解决方案。

ASP.NET Core 中配置的模块性质允许这种灵活性。