這裏要分享的是接着上篇:NET Core-學習筆記(一)展開的繼續學習core筆記,有不妥之處或者更好看法的地方但願各位朋友多多分享。html
下面是本篇將要分享的學習步奏,對於剛學或者即將要學習的朋友作個相互交流:angularjs
1.一塊兒閱覽core框架自動生成的Controller代碼數據庫
2.路由及路由參數格式限制json
3.兩種方法設置虛擬路徑訪問資源文件夾和效果區別瀏覽器
4.怎麼設置異常訪問時全局返回信息mvc
5.構造器依賴注入方式ILogger,IOptions例子app
6.ConfigurationBuilder使用框架
下面一步一個腳印的來分享:asp.net
1.一塊兒閱覽core框架自動生成的Controller代碼async
首先,咋們來看一個圖
重點部分已經使用紅色框好了,先是這個ApplicationDbContext應用程序數據上下文,是由構造器傳遞進來的,可是這種狀況通常是須要new 這個構造器對應的class,才能傳遞進入參數,當翻遍整個項目都暫時沒有找到對應new這個Controller的地方,所以這也延伸出了這裏要說的注入方式;這個ApplicationDbContext你們能夠打開項目文件Startup.cs裏面有這樣一段:
1 services.AddDbContext<ApplicationDbContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
是的剛纔說的訪問數據庫上下文就是由這裏注入進來的,只須要這麼一段,就能連接上數據庫了,當讓裏面的Configuration.GetConnectionString是獲取數據庫字符串,這些上一篇文章簡單介紹了下;
其次,你們能夠看到Controller裏面的幾個操做方法都是async Task的模式,對應的方法內使用的也是await FunAsync();來返回數據,這裏的幾個關鍵字你們應該很熟悉了是4.5框架擴展出來的;簡單說下本人使用這幾個關鍵詞通常注意的邏輯,async await兩個確定是成對出現的,await從單詞也能看出是等待的意思,主要是等待後面的方法執行完成返回結果,返回的結果對應的值應該是Task包裝的數據,而Task任務都是有Result,這樣經過Result獲取以前方法執行的結果;
2.路由及路由參數格式限制
首先,說道mvc就不得不說對應的路由core框架設置路由是在StartUp.cs文件Configure方法中,初始化代碼以下:
1 //設置mvc路由 2 app.UseMvc(routes => 3 { 4 //這裏的{id?} ?號表示能夠有可無 5 routes.MapRoute( 6 name: "default", 7 template: "{controller=Home}/{action=Index}/{id?}"); 8 });
這裏有兩種設置默認值的方式一種就是上面代碼那樣直接=號後面設置默認值,另一種就是MapRoute方法的第三個參數和之前mvc版本同樣new{param}的格式,你們能夠本身試試;
而後,咱們一塊兒參數格式限制,直接在參數後面:數據類型(如 id:int),這個時候參數只能傳遞對應的數據類型的數據,這裏列舉兩個格式如圖(注若是是正則無需能夠去掉\):
1 routes.MapRoute( 2 name: "first", 3 template: "{controller=Home}/{action=Index}/{id:int}"); 4 routes.MapRoute( 5 name: "second", 6 template: "{controller=Home}/{action=Index}/{id:regex(d+)}");
很實用更多的限制能夠查看:https://docs.asp.net/en/latest/fundamentals/routing.html
3.兩種方法設置虛擬路徑訪問資源文件夾和效果區別
首先,咋們定位到Startup.cs文件Configure方法,要開放查看可訪問資源的目錄須要用到UseDirectoryBrowser和UseFileServer兩個方法,其實他們都對應ConfigureServices服務方法中添加的AddDirectoryBrowser()服務,因此須要如今ConfigureServices服務方法中增長一段services.AddDirectoryBrowser();代碼;
先來看UseDirectoryBrowser方法,咱們一塊兒在core項目跟目錄下建立一個angularjs文件夾並在裏面增長angular-1.0.js文件,文件內容能夠隨意(我這裏只有一段註釋///這裏是ng),目錄結果如圖:
而後在Configure方法增長以下代碼:
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 2 { 3 4 //啓動磁盤查看 5 app.UseDirectoryBrowser(new DirectoryBrowserOptions 6 { 7 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "angularjs")), 8 RequestPath = "/ng" 9 10 }); 11 }
FileProvider對應的PhysicalFileProvider主要用來設置物理路徑,RequestPath對應的是虛擬路徑也就是開放給瀏覽器可訪問資源的路徑,來看下執行dotnet run命令後瀏覽器效果:
這裏效果是能夠點擊js文件,可是沒法直接在瀏覽器中展現js文件的內容,也就是沒法訪問到js文件;
再來看UseFileServer(),咱們把剛纔的UseDirectoryBrowser代碼先註釋避免影響效果,而後在Configure方法中增長以下代碼:
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 2 { 3 app.UseFileServer(new FileServerOptions() 4 { 5 FileProvider = new PhysicalFileProvider( 6 Path.Combine(Directory.GetCurrentDirectory(), "angularjs")), 7 RequestPath = "/ng1", 8 EnableDirectoryBrowsing = true 9 }); 10 }
注意這裏的虛擬路徑設置的名稱是ng1,而且增長了一段EnableDirectoryBrowsing=true這句話的意思是容許磁盤瀏覽效果至關於前面增長的代碼services.AddDirectoryBrowser()只是這裏不須要這句也能瀏覽文件目錄,看效果:
這裏也能瀏覽目錄結構了,而後點擊js文件能在瀏覽器中看到:
是的這就是js文件的內容,這種方式直接就能下載某個文件,而前面第一種就不行;若是但願第一種也能下載或者查看js文件,那麼可使用UseStaticFiles()方法來設置,代碼以下:
1 app.UseStaticFiles(new StaticFileOptions 2 { 3 4 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "angularjs")), //物理根路徑 5 RequestPath = "/ng" //設置訪問虛擬路徑 6 7 }); 8 9 //啓動磁盤文件查看 10 app.UseDirectoryBrowser(new DirectoryBrowserOptions 11 { 12 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "angularjs")), 13 RequestPath = "/ng" 14 15 });
注意兩個方法對應的參數RequestPath都是"/ng",這裏目的就是吧這種兩個虛擬路徑設置成同樣的,UseStaticFiles()方法功能是運行某個目錄下文件被訪問,而默認.netcore自動生成的代碼中有app.UseStaticFiles();這麼一句,效果是默認只容許訪問項目wwwroot文件夾中的靜態資源,要訪問其餘根目錄下的靜態資源能夠設置成上面的代碼就好了,須要注意的是自定義的訪問資源設置必需要在默認代碼app.UseStaticFiles();下面才行,否則沒法使用自帶的靜態文件。
4.怎麼設置異常訪問時全局返回信息
這裏要介紹的方法一樣在Configure方法中執行,UseStatusCodePages()和UseExceptionHandler()函數,目前只實驗了UseStatusCodePages一種參數設置,其餘重載的沒有試,但願朋友們測試事後能告知下效果和應用場景,謝謝;
先看,app.UseStatusCodePages("text/plain", "這是 response返回的status code: {0}");我這裏直接返回的是文本數據到頁面上,效果是在瀏覽器中輸入了一個不在路由中的地址,那麼瀏覽器就會顯示此信息,這裏面要注意的是{0},你們能夠看下方法的備註說明,說明的意思大體是這裏直接使用佔位符表示Response返回的Status code代碼,假如我這裏訪問一個再也不路由中的地址效果以下:
而後,app.UseExceptionHandler("/Home/Error");這個是建立項目默認的代碼,這裏指向的路由是HomeController中的Error方法,對應的試圖我沒有找到,不知道是項目故意不須要仍是怎麼樣子,有知道的朋友告知下;
5.構造器依賴注入方式例子
構造器依賴注入其實前面有講過,就是ApplicationDbContext和第一篇分享的代碼中,這裏說的是另外兩個netcore項目自帶的東西ILogger<T>(日誌服務)和IOptions<T>(選項訪問服務),直接上代碼:
1 public class ArticlesController : Controller 2 { 3 private readonly ApplicationDbContext _context; 4 5 private readonly IOptions<Article> _opArticle; 6 7 private readonly ILogger<ArticlesController> _log; 8 9 10 public ArticlesController(ApplicationDbContext context, IOptions<Article> opArticle, ILogger<ArticlesController> log) 11 { 12 _context = context; 13 _opArticle = opArticle; 14 _log = log; 15 } 16 17 // GET: Articles 18 public async Task<IActionResult> Index() 19 { 20 _log.LogInformation("I {0} {1}", "love", "zuguo"); 21 ViewBag.TResult = 4 + 5; 22 ViewBag.TouTiao = _opArticle.Value.Title; 23 24 return View(await _context.Article.ToListAsync()); 25 } 26 }
這裏的ILogger<T>經過構造器賦值給了只讀變量_log,由於是依賴注入進來的,因此能夠直接使用方法我這裏用到的是LogInformation方法其中一個重載,效果是在訪問這個Controller的Index時候cmd命令窗顯示了這個Info等級的信息:
更多的等級信息請查看:https://docs.asp.net/en/latest/fundamentals/logging.html
相對而言IOptions<T>使用的時候須要手動在Startup.cs文件中ConfigureServices方法設置代碼services.AddOptions()來添加服務,這個選項訪問服務功能能夠把知足它泛型需求的class,new()的類注入到其餘的地方,這裏有一個例子在ConfigureServices方法中添加以下代碼:
1 services.AddOptions(); 2 //初始化參數信息 3 services.Configure<Models.AiticleModels.Article>(b => 4 { 5 6 b.Title = "今日頭條,愛國活動"; 7 });
而後能夠在經過構造器注入的某個地方獲取參數值,只須要被注入對象.Value這就能獲取到注入進來的泛型T實例,對應的代碼就是第5點開始的代碼,效果:
6.ConfigurationBuilder使用
先發一段框架自動生成的代碼:
1 public Startup(IHostingEnvironment env) 2 { 3 //這裏建立ConfigurationBuilder,其做用就是加載Congfig等配置文件 4 var builder = new ConfigurationBuilder() 5 6 //env.ContentRootPath:獲取當前項目的跟路徑 7 .SetBasePath(env.ContentRootPath) 8 //使用AddJsonFile方法把項目中的appsettings.json配置文件加載進來,後面的reloadOnChange顧名思義就是文件若是改動就從新加載 9 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 10 //這裏關注的是$"{param}"的這種寫法,有點相似於string.Format() 11 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 12 13 if (env.IsDevelopment()) 14 { 15 //待研究 16 builder.AddUserSecrets(); 17 18 //待研究 19 builder.AddApplicationInsightsSettings(developerMode: true); 20 } 21 22 builder.AddEnvironmentVariables(); 23 24 //這返回一個配置文件跟節點:IConfigurationRoot 25 Configuration = builder.Build(); 26 27 }
這個ConfigurationBuilder在啓動器Startup中加載的時候就去讀取配置文件(更多信息能夠看第一篇或代碼註釋);這裏咱們使用AddInMemoryCollection方法增長配置文件實例的數據:
1 //增長配置數據 2 builder.AddInMemoryCollection(new Dictionary<string, string> { 3 { "home","zuguo"} 4 });
在後就以在Configuration使用的地方獲取到這是的值,這裏使用的是
var home = Configuration["home"];
Console.WriteLine($"hello,{home}");
在命令窗顯示的信息如:
這篇就到這裏,但願給你們帶來了好處,但願更多的心得篇,勿噴。