一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .Net Core簡單使用Mvc內置的Ioc(續)

.Net Core簡單使用Mvc內置的Ioc(續)

2020-05-25 13:51反骨仔 ASP.NET教程

怎樣直接獲取Ioc中的實例對象,而不是以構造函數的方式進行獲取呢?這篇文章繼續為大家介紹.Net Core簡單使用Mvc內置的Ioc

本文基于 .NET Core 2.0。
上一章《[.Net Core] 簡單使用 Mvc 內置的 Ioc》已經對日常 Mvc 中的 Ioc 的簡單用法進行了說明,此外還有一些需要補充的內容。

接下來會圍繞著這些疑問進行回答:AOP 中 Filter 和 Ioc 的結合使用是啥樣子的呢? 怎樣直接獲取 Ioc 中的實例對象,而不是以構造函數的方式進行獲取呢? 

目錄

場景一:Ioc 結合過濾器 Filter 使用
場景二:直接獲取 Ioc 管理的對象 

場景一:Ioc 結合過濾器 Filter 使用

先編寫一個過濾器 ExceptionFilter.cs,繼承 IExceptionFilter,主要是用于錯誤時記錄日志,使用的命名空間是 Microsoft.AspNetCore.Mvc.Filters。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 打印日志的類:

?
1
2
3
4
5
6
7
public class LogService
  {
    public void Error(string message)
    {
      Console.WriteLine(message);
    }
  }

我在控制器 Demo4Controller.cs 內部的 Index() 方法中顯式的讓它拋出尚未實現的異常來進行測試:

?
1
2
3
4
5
6
7
public class Demo4Controller : Controller
  {
    public IActionResult Index()
    {
      throw new NotImplementedException();
    }
  }

接下來,是在核心的 Startup.cs 中的 ConfigureServices() 方法內修改代碼,小編使用 AddSingleton() 作為示例方法進行注入:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void ConfigureServices(IServiceCollection services)
    {
      services.AddSingleton(typeof(ExceptionFilter));   //注入 ExceptionFilter
      services.AddSingleton(typeof(LogService));     //注入 LogService
 
      services.AddMvc(x => {
        //創建一個 ServiceProvider 對象
        var provider = services.BuildServiceProvider();
        var filter = provider.GetService<ExceptionFilter>();
 
        //添加過濾器
        x.Filters.Add(filter);
      });
    }

.Net Core簡單使用Mvc內置的Ioc(續)

啟動程序并跳轉到路徑 http://localhost:port/demo4 后,我們發現能夠觸發異常過濾器:

.Net Core簡單使用Mvc內置的Ioc(續)

場景二:直接獲取 Ioc 管理的對象

測試用的服務類 Demo5Service.cs:

?
1
2
3
4
5
6
7
public class Demo5Service
  {
    public string Test()
    {
      return Guid.NewGuid().ToString();
    }
}

方法一

我們可以在控制器內通過 this.HttpContext.RequestServices.GetService() 的方式獲取已經注入 Ioc 內的服務對象,如控制器 Demo5Controller.cs:

?
1
2
3
4
5
6
7
8
public class Demo5Controller : Controller
  {
    public IActionResult Index()
    {
      var demoService = (Demo5Service) this.HttpContext.RequestServices.GetService(typeof(Demo5Service));
      return Json(demoService.Test());
    }
  }

不要忘記在 Startup.cs 中注入服務類:

.Net Core簡單使用Mvc內置的Ioc(續)

執行結果:

.Net Core簡單使用Mvc內置的Ioc(續)

方法二

通過場景一知道:ServiceProvider 類中的 GetService() 方法可以獲取已經注入的 Ioc 對象,這樣我們可以考慮從如何獲取該對象(ServiceProvider 類對象)著手。

下面,我在 Startup.cs 類中添加一個靜態的 ServiceProvider 類成員屬性,方便可以從外部獲取:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
    }
 
    //...
  }

.Net Core簡單使用Mvc內置的Ioc(續)

之后,我們可以采取這樣的方式獲取 Ioc 中已經注入的對象:

?
1
2
3
4
5
6
7
8
public class Demo5Controller : Controller
 {
  public IActionResult Index()
  {
   var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service));
   return Json(demoService.Test());
  }
 }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/liqingwen/p/8585119.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 5g影院天天爽爽 | 99在线观看视频免费 | 日本公与妇中文在线 | 成年人网站免费在线观看 | 女同学高中你下面好紧 | 国产精品亚洲午夜一区二区三区 | 青草园网站在线观看 | 免费观看成年人视频 | 免费一级欧美片片线观看 | 日本xxxxx18护士xxx| 国产欧美日韩在线观看精品 | 天天乐影院 | 婷婷综合七月激情啪啪 | 男生和老师一起差差差 | 天天做天天玩天天爽天天 | 欧美高清一级 | 免费观看毛片视频 | 欧美一级在线视频 | 国产欧美另类 | 久久精品一区二区免费看 | 91精品啪在线观看国产线免费 | 国产成年人 | 国产一级毛片国语版 | 欧美一级视频在线高清观看 | 国产51社区精品视频资源 | 日韩免费高清完整版 | xxxx成人| 国产成人精品免费 | 国产精品合集一区二区 | 亚洲国产三级在线观看 | 成人免费观看在线视频 | 全肉一女n男np高h乳 | 国产精品嫩草影院在线看 | 精品久久一区 | 欧美另类性xxoo | 青青在线视频免费 | 青青青在线观看国产精品 | 歪歪私人影院成人毛片 | 久久久精品日本一区二区三区 | 国产高清经典露脸3p | 97精品国产自在现线免费 |