文章出處

這里要分享的是接著上篇:NET Core-學習筆記(一)展開的繼續學習core筆記,有不妥之處或者更好見解的地方希望各位朋友多多分享。

下面是本篇將要分享的學習步奏,對于剛學或者即將要學習的朋友做個相互交流:

1.一起閱覽core框架自動生成的Controller代碼

2.路由及路由參數格式限制

3.兩種方法設置虛擬路徑訪問資源文件夾和效果區別

4.怎么設置異常訪問時全局返回信息

5.構造器依賴注入方式ILogger,IOptions例子

6.ConfigurationBuilder使用

 

下面一步一個腳印的來分享:

1.一起閱覽core框架自動生成的Controller代碼

首先,咋們來看一個圖

重點部分已經使用紅色框好了,先是這個ApplicationDbContext應用程序數據上下文,是由構造器傳遞進來的,但是這種情況一般是需要new 這個構造器對應的class,才能傳遞進入參數,當翻遍整個項目都暫時沒有找到對應new這個Controller的地方,因此這也延伸出了這里要說的注入方式;這個ApplicationDbContext大家可以打開項目文件Startup.cs里面有這樣一段:

1 services.AddDbContext<ApplicationDbContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
View Code

是的剛才說的訪問數據庫上下文就是由這里注入進來的,只需要這么一段,就能鏈接上數據庫了,當讓里面的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             });
View Code

這里有兩種設置默認值的方式一種就是上面代碼那樣直接=號后面設置默認值,另外一種就是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+)}");
View Code

很實用更多的限制可以查看: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         }
View Code

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         }
View Code

注意這里的虛擬路徑設置的名稱是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             });
View Code

注意兩個方法對應的參數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     }
View Code

這里的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             });
View Code

然后可以在通過構造器注入的某個地方獲取參數值,只需要被注入對象.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         }
View Code

這個ConfigurationBuilder在啟動器Startup中加載的時候就去讀取配置文件(更多信息可以看第一篇或代碼注釋);這里我們使用AddInMemoryCollection方法增加配置文件實例的數據:

//增加配置數據
            builder.AddInMemoryCollection(new Dictionary<string, string> {
                { "home","zuguo"}
            });
View Code

在后就以在Configuration使用的地方獲取到這是的值,這里使用的是

var home = Configuration["home"];
Console.WriteLine($"hello,{home}");

在命令窗顯示的信息如:

 

這篇就到這里,希望給大家帶來了好處,希望更多的心得篇,勿噴。

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()