• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > .Net Core简单使用Mvc内置的Ioc(续)

.Net Core简单使用Mvc内置的Ioc(续)

作者:反骨仔 字体:[增加 减小] 来源:互联网 时间:2018-08-20

反骨仔 通过本文主要向大家介绍了.Net,Core,Mvc,Ioc等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文基于 .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。

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 内部的 Index() 方法中显式的让它抛出尚未实现的异常来进行测试:

public class Demo4Controller : Controller
  {
    public IActionResult Index()
    {
      throw new NotImplementedException();
    }
  }

接下来,是在核心的 Startup.cs 中的 ConfigureServices() 方法内修改代码,小编使用 AddSingleton() 作为示例方法进行注入:

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);
      });
    }

启动程序并跳转到路径 http://localhost:port/demo4 后,我们发现能够触发异常过滤器:

场景二:直接获取 Ioc 管理的对象

测试用的服务类 Demo5Service.cs:

public class Demo5Service
  {
    public string Test()
    {
      return Guid.NewGuid().ToString();
    }
}

方法一

我们可以在控制器内通过 this.HttpContext.RequestServices.GetService() 的方式获取已经注入 Ioc 内的服务对象,如控制器 Demo5Controller.cs:

public class Demo5Controller : Controller
  {
    public IActionResult Index()
    {
      var demoService = (Demo5Service) this.HttpContext.RequestServices.GetService(typeof(Demo5Service));
      return Json(demoService.Test());
    }
  }

不要忘记在 Startup.cs 中注入服务类:

执行结果:

方法二

通过场景一知道:ServiceProvider 类中的 GetService() 方法可以获取已经注入的 Ioc 对象,这样我们可以考虑从如何获取该对象(ServiceProvider 类对象)着手。

下面,我在 Startup.cs 类中添加一个静态的 ServiceProvider 类成员属性,方便可以从外部获取:

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 中已经注入的对象:

public class Demo5Controller : Controller
 {
  public IActionResult Index()
  {
   var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service));
   return Json(demoService.Test());
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • .net core使用redis基于StackExchange.Redis

相关文章

  • 2017-05-11GridView的CheckBox列选择及多参数传递三步搞定
  • 2017-05-11Repeater怎么实现多行间隔显示分隔符
  • 2017-05-11asp.net(c#)捕捉搜索引擎蜘蛛和机器人
  • 2017-05-11System.Runtime.InteropServices.COMException的解决方法
  • 2017-05-11asp.net(C#)中给控件添加客户端js事件的方法
  • 2017-05-11asp.net弹出窗口 返回值
  • 2017-05-11Asp.net中的数据绑定Eval和Bind应用示例
  • 2017-05-11如何轻松搭建Windows8云平台的开发环境
  • 2017-05-11asp.net 细说文件读写操作(读写锁)
  • 2017-05-11ABP入门系列应用BootstrapTable表格插件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 常用JavaScript代码提示公共类封装
    • ASP.NET缓存管理的几种方法
    • ASP.NET开发者使用jQuery应该了解的几件事情
    • LINQ字符串向datetime 转换时失败的处理方法
    • .net实现ping的实例代码
    • ASP.NET 2.0服务器控件开发之复杂属性
    • asp.net中提示该行已属于另一个表的解决方法
    • 解读ASP.NET 5 & MVC6系列教程(16):自定义View视图文件查找逻辑
    • silverlight用webclient大文件上传的实例代码
    • OpenCV 3.1.0+VS2015开发环境配置教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有