Reputation: 65238
In the startup file I need a way to access IConfiguration in another project. I have been told the Business Logic should not know about IConfiguration. If thats the case then how do I inject data from appsettings down to the business logic projects.
appsettings.json
{
"AdminEmail": "[email protected]"
}
How would I access AdminEmail in a class library I created in the same solution?
Upvotes: 14
Views: 34919
Reputation: 402
This helper class provider:
public class AppSettings
{
private static AppSettings _appSettings;
public string appSettingValue { get; set; }
public static string Get(string Key)
{
_appSettings = GetCurrentSettings(Key);
return _appSettings.appSettingValue;
}
public AppSettings(IConfiguration config, string Key)
{
this.appSettingValue = config.GetValue<string>(Key);
}
public static AppSettings GetCurrentSettings(string Key)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
IConfigurationRoot configuration = builder.Build();
var settings = new AppSettings(configuration, Key);
return settings;
}
}
To use that helper, you should install all this packages:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Configuration.EnvironmentVariables
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json
Examples how you could use that in your code:
AppSettings.Get("SomeKey");
AppSettings.Get("Redis:Host");
AppSettings.Get("ConnectionString:mssql");
Upvotes: 0
Reputation: 6090
Define a model for settings
public sealed class EmailSettings
{
public string AdminEmail { get; set; }
}
Configure settings
public sealed class Startup
{
private readonly IConfiguration configuration;
public Startup(IConfiguration configuration) => this.configuration = configuration;
public void ConfigureServices(IServiceCollection services)
{
services
.Configure<EmailSettings>(configuration)
.AddSingleton(sp => sp.GetRequiredService<IOptions<EmailSettings>>().Value);
}
}
Inject and use it
public class ClassLibraryInTheSameSolution
{
public ClassLibraryInTheSameSolution(EmailSettings emailSettings)
{
}
}
Upvotes: 13
Reputation: 645
You can use Microsoft.Extensions.Configuration
to achieve this. https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration
1 - Create a model for the settings
public class AppSettings
{
public string AdminEmail { get; set; }
}
2 - Configure it on Startup.cs
services.Configure<AppSettings>(Configuration);
3 - Use DI in your class library to retrieve the settings
private readonly AppSettings _appSettings;
public MyClass(IOptions<AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
Upvotes: 3
Reputation: 32068
You could inject it quite easily:
public class EmailSettings
{
public string AdminEmail { get; set; } // encapsulate as needed
}
public void ConfigureServices(IServiceCollection services)
{
var settings = new EmailSettings
{
AdminEmail = Configuration["AdminEmail"]
};
services.AddSingleton(settings);
}
public class WhereverYouNeedThis
{
private readonly EmailSettings _emailSettings;
public WhereverYouNeedThis(EmailSettings emailSettings)
{
_emailSettings = emailSettings;
}
public void Use()
{
Debug.Log(_emailSettings.AdminEmail);
}
}
Upvotes: 1