.Net Core簡單使用Mvc內(nèi)置的Ioc(續(xù))
本文基于 .NET Core 2.0。
上一章《[.Net Core] 簡單使用 Mvc 內(nèi)置的 Ioc》已經(jīng)對日常 Mvc 中的 Ioc 的簡單用法進(jìn)行了說明,此外還有一些需要補(bǔ)充的內(nèi)容。
接下來會圍繞著這些疑問進(jìn)行回答:AOP 中 Filter 和 Ioc 的結(jié)合使用是啥樣子的呢? 怎樣直接獲取 Ioc 中的實(shí)例對象,而不是以構(gòu)造函數(shù)的方式進(jìn)行獲取呢?
目錄
場景一:Ioc 結(jié)合過濾器 Filter 使用
場景二:直接獲取 Ioc 管理的對象
場景一:Ioc 結(jié)合過濾器 Filter 使用
先編寫一個(gè)過濾器 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 打印日志的類:
public class LogService
{
public void Error(string message)
{
Console.WriteLine(message);
}
}
我在控制器 Demo4Controller.cs 內(nèi)部的 Index() 方法中顯式的讓它拋出尚未實(shí)現(xiàn)的異常來進(jìn)行測試:
public class Demo4Controller : Controller
{
public IActionResult Index()
{
throw new NotImplementedException();
}
}
接下來,是在核心的 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 對象
var provider = services.BuildServiceProvider();
var filter = provider.GetService<ExceptionFilter>();
//添加過濾器
x.Filters.Add(filter);
});
}

啟動程序并跳轉(zhuǎn)到路徑 http://localhost:port/demo4 后,我們發(fā)現(xiàn)能夠觸發(fā)異常過濾器:

場景二:直接獲取 Ioc 管理的對象
測試用的服務(wù)類 Demo5Service.cs:
public class Demo5Service
{
public string Test()
{
return Guid.NewGuid().ToString();
}
}
方法一
我們可以在控制器內(nèi)通過 this.HttpContext.RequestServices.GetService() 的方式獲取已經(jīng)注入 Ioc 內(nèi)的服務(wù)對象,如控制器 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ù)類:

執(zhí)行結(jié)果:

方法二
通過場景一知道:ServiceProvider 類中的 GetService() 方法可以獲取已經(jīng)注入的 Ioc 對象,這樣我們可以考慮從如何獲取該對象(ServiceProvider 類對象)著手。
下面,我在 Startup.cs 類中添加一個(gè)靜態(tài)的 ServiceProvider 類成員屬性,方便可以從外部獲?。?/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)注入的對象:
public class Demo5Controller : Controller
{
public IActionResult Index()
{
var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service));
return Json(demoService.Test());
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后臺管理系統(tǒng)之前端頁面框架構(gòu)建源碼分享
- asp.net CommunityServer中的wwwStatus
- .Net Core簡單使用Mvc內(nèi)置的Ioc
- Spring.Net控制反轉(zhuǎn)IoC入門使用
- ASP.NET Core應(yīng)用中與第三方IoC/DI框架的整合
- MVC使用Spring.Net應(yīng)用IOC(依賴倒置)學(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)度條的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
在asp.net core中使用類似Application的服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了在asp.net core中使用類似Application的服務(wù)的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
Asp.net 圖片文件防盜鏈(尊重勞動成果)及BeginRequest事件學(xué)習(xí)
關(guān)于圖片盜鏈這個(gè)問題,畢竟是自己的勞動成功,很多人不希望別人就那么輕易地偷走了;反盜鏈的程序其實(shí)很簡單,熟悉ASP.NET 應(yīng)用程序生命周期的話很容易就可以寫一個(gè),運(yùn)用HttpModule在BeginRequest事件中攔截請求就ok了2013-01-01
ASP.NET MVC中將控制器分離到類庫的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-06-06

