我有一个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接口。
答案 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的值,但对我的应用程序并不重要。
希望这可以帮助像我这样的人。