.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)證用戶登錄(4)
- .NET Unity IOC框架使用實(shí)例詳解
相關(guān)文章
ASP.NET?MVC使用jQuery?ui的progressbar實(shí)現(xiàn)進(jìn)度條
這篇文章介紹了ASP.NET?MVC使用jQuery?ui的progressbar實(shí)現(xiàn)進(jìn)度條的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
在asp.net core中使用類(lèi)似Application的服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了在asp.net core中使用類(lèi)似Application的服務(wù)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Asp.net 圖片文件防盜鏈(尊重勞動(dòng)成果)及BeginRequest事件學(xué)習(xí)
關(guān)于圖片盜鏈這個(gè)問(wèn)題,畢竟是自己的勞動(dòng)成功,很多人不希望別人就那么輕易地偷走了;反盜鏈的程序其實(shí)很簡(jiǎn)單,熟悉ASP.NET 應(yīng)用程序生命周期的話很容易就可以寫(xiě)一個(gè),運(yùn)用HttpModule在BeginRequest事件中攔截請(qǐng)求就ok了2013-01-01
ASP.NET MVC中將控制器分離到類(lèi)庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET MVC中將控制器分離到類(lèi)庫(kù)的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-06-06
Asp.net?core程序中使用微軟的依賴(lài)注入框架
這篇文章介紹了在Asp.net?core程序中使用微軟的依賴(lài)注入框架,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
根據(jù)控件Id得到控件并對(duì)該控件進(jìn)行操作
在做動(dòng)態(tài)獲取控件時(shí),時(shí)常需要根據(jù)Id得到控件,并對(duì)該控件進(jìn)行操作,示例如下,大家可以參考下2014-06-06
在.NET Core控制臺(tái)程序中如何使用依賴(lài)注入詳解
這篇文章主要給大家介紹了關(guān)于在.NET Core控制臺(tái)程序中如何使用依賴(lài)注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

