在MVC 5中从appsettings.json中读取和使用设置

时间:2018-03-25 16:24:56

标签: c# .net asp.net-mvc

我有一个MVC 5项目(框架4.6.1),我想从appsettings.json加载POCO。

我的MVC应用程序没有Startup.cs,起点似乎是Global.asax。 我尝试添加Owin以获得Startup.cs,但与我发现的大多数文章相反,Configuration似乎是在启动期间调用的void方法,而不是像net core中那样的IConfiguration。

This article几乎尝试做我想做的事情,但也假设Configuration是一个IConfiguration接口。

1 个答案:

答案 0 :(得分:1)

好的,这就是我最终做的事情:

我想从appsettings.json加载一个类ScrumBan的对象。

我宣布了这个班级

public class ChartConfiguration: IChartConfiguration
{
    public Scrumban Scrumban { get; }
    public ChartConfiguration()
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build();
        Scrumban = new Scrumban();
        configuration.GetSection("Scrumban").Bind(Scrumban);

    }
}

接口仅公开ScrumBan对象:

public interface IChartConfiguration
{
    Scrumban Scrumban { get; }
}

然后我包括了Unity for Dependency Injection处理并注册了我的界面:

public static class IocExtensions
{
    public static void BindInRequestScope<T1, T2>(this IUnityContainer container) where T2 : T1
    {
        container.RegisterType<T1, T2>(new HierarchicalLifetimeManager());
    }

}

public class UnityMvc5
{
    public static void Start()
    {
        var container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // Configuration object, one per request, ensure it is disposed
        container.BindInRequestScope<IChartConfiguration, ChartConfiguration>();

        return container;
    }
}

最后在Global.asax.cs的Application_Start中我添加了UnityMvc5.Start():

    protected void Application_Start()
    {
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AreaRegistration.RegisterAllAreas();
        UnityMvc5.Start();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

有了Unity,我现在可以更改我的Controller构造函数以包含我的IChartConfiguration接口并将其存储以供将来参考,这与ASP.NET Core的常见做法完全相同。

我不太确定实例化模型BindInRequestScope,我本可以选择单例,但据我所知,ChartConfiguration构造函数无论如何都不会被调用。同样地,我不确定reloadOnChange的值,但对我的应用程序并不重要。

希望这可以帮助像我这样的人。