ASP.NET Core project template comes with appsettings.json
and appsettings.Development.json
and it is added by default in CreateDefaultBuilder.
Because the project with DbContext
is separate from my ASP.NET Core project (MyProject.Data
) I am required to implement IDesignTimeDbContextFactory
for my context in order for commands like Add-Migration
and Update-Database
to work. I don't want to hardcode my connection string for my IDesignTimeDbContextFactory
but re-use the config in both projects.
I have few solutions for it but I want to know what's the most reasonable based on your experiences and opinions.
IDesignTimeDbContextFactory
in my ASP.NET Core (UI layer) project.IDesignTimeDbContextFactory
in my MyProject.Data
project, and move appsettings.json
to some root directory, or configuration
(located at root) directory shared between projects.database.json
put it alongside my .sln
file.How should I share this?
EDIT:
There's similar question and answer here: ConnectionString from appsettings.json in Data Tier with Entity Framework Core but it doesn't answer my question. It doesn't say anything about data tier at all. I don't want to re-use logic for adding db context. I want to re-use connection string in two projects to avoid duplicating connection strings.
While is it usually advised to have configuration in a central location, there is nothing restricting individual projects from managing their own configuration.
In the following example the connection string information is stored in an external datasettings.json file
{
"ConnectionStrings": {
"DefaultConnection": "connection string here"
}
}
A simple example of a self contained setup extension for the layer could look like
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;
}
}
And added in Startup
using my.data.layer;
//...
public void ConfigureServices(IServiceCollection services) {
//...
services.AddMyDataLayer();
//...
}
The data layer in this case manages its own configuration. Its settings file external to the application settings.
There is room for expansion as additional options could be managed locally as well and works well for drop-in turn key plug-in solutions for example.
The module nature of Configuration in ASP.NET Core allows for such flexibilities.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With