Luke101
Luke101

Reputation: 65238

How to access appsettings from another project

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

Answers (4)

Lev K.
Lev K.

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

Andriy Tolstoy
Andriy Tolstoy

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

P.N.
P.N.

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

Camilo Terevinto
Camilo Terevinto

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

Related Questions