.Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc(續(xù))
本文基于 .NET Core 2.0。
上一章《[.Net Core] 簡(jiǎn)單使用 Mvc 內(nèi)置的 Ioc》已經(jīng)對(duì)日常 Mvc 中的 Ioc 的簡(jiǎn)單用法進(jìn)行了說(shuō)明,此外還有一些需要補(bǔ)充的內(nèi)容。
接下來(lái)會(huì)圍繞著這些疑問(wèn)進(jìn)行回答:AOP 中 Filter 和 Ioc 的結(jié)合使用是啥樣子的呢? 怎樣直接獲取 Ioc 中的實(shí)例對(duì)象,而不是以構(gòu)造函數(shù)的方式進(jìn)行獲取呢?
目錄
場(chǎng)景一:Ioc 結(jié)合過(guò)濾器 Filter 使用
場(chǎng)景二:直接獲取 Ioc 管理的對(duì)象
場(chǎng)景一:Ioc 結(jié)合過(guò)濾器 Filter 使用
先編寫(xiě)一個(gè)過(guò)濾器 ExceptionFilter.cs,繼承 IExceptionFilter,主要是用于錯(cuò)誤時(shí)記錄日志,使用的命名空間是 Microsoft.AspNetCore.Mvc.Filters。
using Microsoft.AspNetCore.Mvc.Filters; namespace IocCoreDemo { public class ExceptionFilter : IExceptionFilter { private readonly LogService _logService; public ExceptionFilter(LogService logService) { _logService = logService; } public void OnException(ExceptionContext context) { _logService.Error(context.Exception.Message); } } }
LogService.cs 打印日志的類(lèi):
public class LogService { public void Error(string message) { Console.WriteLine(message); } }
我在控制器 Demo4Controller.cs 內(nèi)部的 Index() 方法中顯式的讓它拋出尚未實(shí)現(xiàn)的異常來(lái)進(jìn)行測(cè)試:
public class Demo4Controller : Controller { public IActionResult Index() { throw new NotImplementedException(); } }
接下來(lái),是在核心的 Startup.cs 中的 ConfigureServices() 方法內(nèi)修改代碼,小編使用 AddSingleton() 作為示例方法進(jìn)行注入:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton(typeof(ExceptionFilter)); //注入 ExceptionFilter services.AddSingleton(typeof(LogService)); //注入 LogService services.AddMvc(x => { //創(chuàng)建一個(gè) ServiceProvider 對(duì)象 var provider = services.BuildServiceProvider(); var filter = provider.GetService<ExceptionFilter>(); //添加過(guò)濾器 x.Filters.Add(filter); }); }
啟動(dòng)程序并跳轉(zhuǎn)到路徑 http://localhost:port/demo4 后,我們發(fā)現(xiàn)能夠觸發(fā)異常過(guò)濾器:
場(chǎng)景二:直接獲取 Ioc 管理的對(duì)象
測(cè)試用的服務(wù)類(lèi) Demo5Service.cs:
public class Demo5Service { public string Test() { return Guid.NewGuid().ToString(); } }
方法一
我們可以在控制器內(nèi)通過(guò) this.HttpContext.RequestServices.GetService() 的方式獲取已經(jīng)注入 Ioc 內(nèi)的服務(wù)對(duì)象,如控制器 Demo5Controller.cs:
public class Demo5Controller : Controller { public IActionResult Index() { var demoService = (Demo5Service) this.HttpContext.RequestServices.GetService(typeof(Demo5Service)); return Json(demoService.Test()); } }
不要忘記在 Startup.cs 中注入服務(wù)類(lèi):
執(zhí)行結(jié)果:
方法二
通過(guò)場(chǎng)景一知道:ServiceProvider 類(lèi)中的 GetService() 方法可以獲取已經(jīng)注入的 Ioc 對(duì)象,這樣我們可以考慮從如何獲取該對(duì)象(ServiceProvider 類(lèi)對(duì)象)著手。
下面,我在 Startup.cs 類(lèi)中添加一個(gè)靜態(tài)的 ServiceProvider 類(lèi)成員屬性,方便可以從外部獲?。?/p>
public class Startup { public static ServiceProvider ServiceProvider { get; private set; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<Demo5Service>(); ServiceProvider = services.BuildServiceProvider(); } //... }
之后,我們可以采取這樣的方式獲取 Ioc 中已經(jīng)注入的對(duì)象:
public class Demo5Controller : Controller { public IActionResult Index() { var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service)); return Json(demoService.Test()); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后臺(tái)管理系統(tǒng)之前端頁(yè)面框架構(gòu)建源碼分享
- asp.net CommunityServer中的wwwStatus
- .Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc
- Spring.Net控制反轉(zhuǎn)IoC入門(mén)使用
- ASP.NET Core應(yīng)用中與第三方IoC/DI框架的整合
- MVC使用Spring.Net應(yīng)用IOC(依賴(lài)倒置)學(xué)習(xí)筆記3
- .net MVC使用IPrincipal進(jìn)行Form登錄即權(quán)限驗(yàn)證(3)
- .net MVC使用Session驗(yàn)證用戶(hù)登錄(4)
- .NET Unity IOC框架使用實(shí)例詳解
相關(guān)文章
.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
在本文里小編給大家分享了關(guān)于.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-05-05使用.NET?6開(kāi)發(fā)TodoList應(yīng)用之引入數(shù)據(jù)存儲(chǔ)的思路詳解
在這篇文章中,我們僅討論如何實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)基礎(chǔ)設(shè)施的引入,具體的實(shí)體定義和操作后面專(zhuān)門(mén)來(lái)說(shuō)。對(duì).NET?6開(kāi)發(fā)TodoList引入數(shù)據(jù)存儲(chǔ)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-12-12asp.net Excel轉(zhuǎn)換為SQL Server的方法
辦公軟件Excel是一種常用的電子表格軟件,在編程項(xiàng)目中有需要將Excel轉(zhuǎn)換為SQL Server數(shù)據(jù)庫(kù)的需求,本文對(duì)此進(jìn)行一些介紹并給出設(shè)計(jì)代碼。2009-06-06asp.net運(yùn)行提示未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例錯(cuò)誤解決方法
asp.net運(yùn)行提示未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例錯(cuò)誤解決方法,需要的朋友可以參考下2012-03-03Visual Studio 2017開(kāi)發(fā)環(huán)境的安裝圖文教程
Visual Studio 2017是微軟于2017年3月8日正式推出的新版本,是迄今為止 最具生產(chǎn)力 的 Visual Studio 版本。這篇文章主要介紹了Visual Studio 2017開(kāi)發(fā)環(huán)境的安裝,需要的朋友可以參考下2017-11-11asp.net 截取Http請(qǐng)求的實(shí)現(xiàn)代碼
本篇文章比較短,主要是因?yàn)槲业囊粋€(gè)隨想產(chǎn)生的一段代碼。 這段代碼的功能你可以叫做是簡(jiǎn)單的Http服務(wù)器也可以叫做Http請(qǐng)求截取。它實(shí)現(xiàn)的功能就是截取Http請(qǐng)求然后自己做處理。2010-06-06顯示非站點(diǎn)目錄及映射網(wǎng)絡(luò)磁盤(pán)路徑的圖片
本文就將教你怎樣顯示非站點(diǎn)目錄下的圖片,你可以顯示站點(diǎn)所在服務(wù)器所有驅(qū)動(dòng)器目錄的圖片,以及映射網(wǎng)絡(luò)磁盤(pán)路徑的圖片,感興趣的朋友可以了解下就當(dāng)鞏固知識(shí)了或許對(duì)你學(xué)習(xí).net有所幫助2013-02-02Visual Studio 2017下ASP.NET CORE的TagHelper智能提示解決辦法
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017下ASP.NET CORE TagHelper智能提示的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03