How can I retrieve AppSettings configuration back

2019-02-17 07:12发布

Assuming that I am using the new DepencyInjection framework to configure my classes and dependencies in the new ASP.Net/vNext.

How can I use, How can I get my pre-defined configuration settings?

    public void ConfigureServices(IServiceCollection services)
    {
        // Add Application settings to the services container.
        services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));

        // Add EF services to the services container.
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        // Add Identity services to the services container.
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        // Configure the options for the authentication middleware.
        // You can add options for Google, Twitter and other middleware as shown below.
        // For more information see http://go.microsoft.com/fwlink/?LinkID=532715
        services.Configure<FacebookAuthenticationOptions>(options =>
        {
            options.AppId = Configuration["Authentication:Facebook:AppId"];
            options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
        });

        services.Configure<MicrosoftAccountAuthenticationOptions>(options =>
        {
            options.ClientId = Configuration["Authentication:MicrosoftAccount:ClientId"];
            options.ClientSecret = Configuration["Authentication:MicrosoftAccount:ClientSecret"];
        });

        // Add MVC services to the services container.
        services.AddMvc();

        services.AddSingleton(a =>
        {
            //AppSettings settingsModel = ?? //GET CONFIGURATION SETTINGS FILLED 

            // TECHNICAL ARTIFICE TO RETRIEVE CURRENT SETTINGS
            //var settingsModel = new AppSettings();
            //var config = Configuration.GetSubKey("AppSettings");
            //foreach (var item in typeof(AppSettings).GetProperties().Where(b => b.CanWrite))
            {
                //item.SetValue(settingsModel, config.Get(item.Name));
            }

            return new FooService(settingsModel);
        });

        //Uncomment the following line to add Web API services which makes it easier to port Web API 2 controllers.
        //You will also need to add the Microsoft.AspNet.Mvc.WebApiCompatShim package to the 'dependencies' section of project.json.
        services.AddWebApiConventions();
    }

1条回答
我命由我不由天
2楼-- · 2019-02-17 07:48

You can get AppSettings in your FooService by injecting IOptions<AppSettings> DI service in it's constructor.

The IOptions<> interface is part of something called Options Model which is used for accessing POCO style settings(ex: your AppSettings) across your application. The calls like services.Configure<AppSettings>( and services.Configure<FacebookAuthenticationOptions>(options => in your above example, actually register DI services which in turn are used by a DI service called OptionsManager when resolving requests for IOptions<>.

Example:

public class FooService
{
    private readonly AppSettings _settings;

    public FooService(IOptions<AppSettings> options)
    {
        _settings = options.Options;
    }

    ....
    ....
}
查看更多
登录 后发表回答