1. 程式人生 > >.Net Core(三)MVC Core

.Net Core(三)MVC Core

facetype var http rtu autofac lob addm 添加 實例

技術分享

MVC Core的改動感覺挺大的,需要的功能大多從Nuget安裝,還內置了IOC,支持SelfHost方式運行等等。

一、項目結構的變化
創建的新MVC項目的結構發生了變化,比如:靜態文件需要統一放置到wwwroot文件夾,配置文件變成了appsettings.json,用startup.cs文件代替了global文件;原先對view命名空間的引用配置在view下的web.config,現在則改成了使用_ViewImport.cshtml文件,並且用razor語法來配置。

二、內置IOC
a)Autofac是很好的IOC容器,.Net Core下也還是可以用的,同時Core也內置了IOC,typescript也自帶IOC,也許註入的方式會作為語言本身的一種功能吧。
內置IOC也支持選擇多種對象生命周期,比如Transient(內次請求都會實例化)、Scoped(每次Web請求)、Singleton(整個應用的生命周期)。
b)單個對象的註入只需在Startup.ConfigureServices中設置:services.AddSingleton(typeof(Person));
之後在用到Person的地方通過構造函數註入。
c)實際應用了不可能采用單個對象的註入的方式,根據程序集來配置自動註入的方式為:
var serviceAsm = Assembly.Load(new AssemblyName("2_1 MVC Core Lib"));
var serviceTypes = serviceAsm.GetTypes().Where(t => typeof(IServiceTag)
.IsAssignableFrom(t) && !t.GetTypeInfo().IsAbstract);
foreach (var serviceType in serviceTypes) {
var interfaceTypes = serviceType.GetInterfaces().Where(t => t.Name != "IServiceTag");
foreach (var interfaceType in interfaceTypes) {
services.AddSingleton(interfaceType, serviceType);
}
}
增加t.Name != "IServiceTag"的限制是有必要的,IServiceTag是Service接口的標記,如果不增加這個判斷,會將IServiceTag也註入。

d)IOC可以“遞歸”註入,但要保證根對象也是被IOC創建的,而不是顯式new出來的。比如如果用IOC創建ExceptionFilter,那麽它自身引用的其它類也可以自動註入了。手動用IOC創建nFilter並添加到MVC中的方法為:
services.AddMvc(options => {
var serviceProvider = services.BuildServiceProvider();
var filter = serviceProvider.GetService<ExceptionFilter>();
options.Filters.Add(filter);
});

在前端代碼中還可以用HttpContext.RequestServices.GetService來讓IOC創建對象。


學習資料:如鵬網.net提高班http://www.rupeng.com/News/10/4603.shtml

.Net Core(三)MVC Core