NET Core-學習筆記(二)

這裏要分享的是接着上篇: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}");

在命令窗顯示的信息如:

 

這篇就到這裏,但願給你們帶來了好處,但願更多的心得篇,勿噴。

相關文章
相關標籤/搜索