tnblog
首页
视频
资源
登录

Net Core使用依赖注入应用过滤器+自定义中间件

9643人阅读 2019/12/24 16:16 总访问:400915 评论:2 收藏:0 手机
分类: .NET Core

圣诞节快乐

过什么圣诞节哦,圣诞老人已经被我抓起来了。

 


  

我们今天主要讲的是NET Core中的依赖注入数据,使用过滤器调用+自定义中间件

第一步:我们可以在项目里新建一个文件夹:Filter,然后添加一个过滤器的类,实现接口。

  1.   //net core过滤器中使用依赖注入
  2.     public class LogFilter : IActionFilter
  3.     {
  4.         public void OnActionExecuted(ActionExecutedContext context)
  5.         {
  6.            
  7.         }
  8.         public void OnActionExecuting(ActionExecutingContext context)
  9.         {
  10.             
  11.         }
  12.     }

第二步:在Startup.cs服务里的ConfigureServices方法为过滤器添加全局的方法。

  1.    //为net core 过滤器添加全局变量
  2.    services.AddMvc(a => a.Filters.Add(new LogFilter())).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

然后我们调试就可以看到,项目先进过滤器,再进的home/index控制器。

第三步:我们为了做一些控制器里操作,肯定需要数据,这里调用数据也有些不同。

我们要使用依赖注入的数据,不能像以前一样实例化调用,需要定义一个接口对象,在调用对象。

  1.  //得到对象
  2.   private readonly IUserDAL _userDAL;
  3.         public LogFilter(IUserDAL userDAL)
  4.         {
  5.             _userDAL = userDAL;
  6.         }
  7.         public void OnActionExecuted(ActionExecutedContext context)
  8.         {
  9.            
  10.         }
  11.  public void OnActionExecuting(ActionExecutingContext context)
  12.         {
  13.             
  14.         }


然后我们要在Startup.cs服务里的ConfigureServices方法为过滤器AddMvc()添加全局的方法,注释原来的。

  1.   //过滤器配置依赖注入的关系
  2.    services.AddScoped<LogFilter>();
  3.    
  4.  //为net core 过滤器添加全局变量,依赖注入数据,需要配置依赖注入的关系
  5.   services.AddMvc(a => a.Filters.AddService<LogFilter>()).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

下面我们运行调试项目,也是先进入过滤器作判断的,并且过滤器里的数据也是拿到的,大家做的时候可以仔细看下。

控制器home/index的代码如下:

  1.    private readonly IUserDAL _userDAL;
  2.    public HomeController(IUserDAL userDAL)
  3.         {
  4.             _userDAL = userDAL;         
  5.         }
  6.         
  7.   public IActionResult Index()
  8.         {
  9.             int hashcode = _userDAL.GetHashCode();
  10.             ViewBag.hashcode = hashcode;
  11.             //  Response.Body.Write(System.Text.Encoding.Default.GetBytes(hashcode + ""));
  12.             //直接在容器里边获取依赖注入
  13.             IUserDAL userDALTwo = HttpContext.RequestServices.GetService(typeof(IUserDAL)) as IUserDAL;
  14.             ViewBag.hashcode2 = userDALTwo.GetHashCode();
  15.             return View();
  16.         }

前台用ViewBag传值就行了,输出值如下:

 不知道大家有没有注意,我们在Startup.cs服务里为过滤器添加依赖关系的时候,用的模式是AddScoped()

 实际上这里还有一个知识点。就是  -->


Asp.NetCore 服务依赖注入的三个模式以及三个模式的区别


AddTransient瞬时模式:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例

使用方式:services.AddTransient<IOperationTransient, Operation>();


AddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例

使用方式:services.AddScoped<IMyDependency, MyDependency>();

 

AddSingleton单例模式:每次都获取同一个实例

使用方式:services.AddSingleton<IOperationSingleton, Operation>();


以我们项目的UserDAL,UserDALTwo,IUserDAL为例。调用数据

  1.    //服务添加用户继承的接口:配置依赖注入的关系
  2.     services.AddTransient<IUserDAL, UserDAL>();  //瞬时模式
  3.      //  services.AddSingleton<IUserDAL, UserDALTwo>();  //单例模式  因为UserDAL里面的注入和单例模式有冲突,不可用
  4.       //services.AddScoped<IUserDAL, UserDALTwo>(); //同一次请求:区别于瞬时模式和单利模式 UserDAL和UserDALTwo都可以使用

       我们使用瞬时模式时,调用数据,运行效果如下:

    

   我们可以发现hashcode和hashcode2,每次刷新的值是不相同的。单例模式的话就是每次都获取同一个实例,这里就不演示了。


   最后的一个重点就是Net Core 的自定义中间件

一、中间件介绍

        中间件是组装到应用程序管道中用来理请求逻辑和响应逻辑的组件。

  每个组件都可以:

    1.选择是否将请求传递给管道中的下一个组件。

    2.调用管道中的下一个组件之前和之后执行的工作。

  请求委托(Requestdelegates)用于构建请求管道,处理每个HTTP请求。

 二、自定义中间件

有很多中间件微软已经给我提供了,但是如何自定义中间件呢?

第一步:新建一个文件夹,定义一个类,并添加以下代码

  1.  public class RequestIPMiddleware
  2.     {
  3.         private readonly RequestDelegate _next;
  4.         //写系统控制台日志
  5.         private readonly ILogger _logger;
  6.         // 管道执行到该中间件时候下一个中间件的RequestDelegate请求委托,如果有其它参数,也同样通过注入的方式获得
  7.         public RequestIPMiddleware(RequestDelegate next, ILoggerFactory logger)
  8.         {
  9.                //通过注入方式获得对象
  10.             _next = next;
  11.             _logger = logger.CreateLogger<RequestIPMiddleware>();
  12.         }
  13.        //自定义中间件要执行的逻辑
  14.         public async Task Invoke(HttpContext content)
  15.         { 
  16.         Console.WriteLine("Request1");//请求进来时逻辑,为了验证顺序性,打印一句话
  17.               await _next(content);//把context传进去执行下一个中间件
  18.               await content.Response.WriteAsync("<p>Response1</p>");//响应出去时逻辑,为了验证顺序性,输出一句话
  19.         } 
  20.     }

  第二步:在Startup类中的Configure方法下,通过调用UseMiddleware方法注册中间件。
            如果自定义的中间件Invoke方法需要传递参数,则可以通过UseMiddleware方法把参数传进去,
            而自定义的RequestIPMiddleware则需要通过依赖注入的方式拿到所传进去的参数


  1.     //使用自己的中间件
  2.    app.UseMiddleware<RequestIPMiddleware>();
以项目调试,(不要以IIS调试),我们就能看到效果,
 
 

在自定义中间件的系统控制台文件中还有一些提示效果。
 
  1.   public async Task Invoke(HttpContext content)
  2.         {
  3.             //Console.WriteLine("Request1");//请求进来时逻辑,为了验证顺序性,打印一句话
  4.             //await _next(content);//把context传进去执行下一个中间件
  5.             //await content.Response.WriteAsync("<p>Response1</p>");//响应出去时逻辑,为了验证顺序性,输出一句话
  6.             //执行操作  LogInformation:详情信息
  7.             //LogError:错误信息  ,LogWarning:警告信息
  8.             _logger.LogWarning("执行自己的中间件,获取Ip地址");
  9.             _logger.LogError("My Ip:" + content.Connection.RemoteIpAddress.ToString());
  10.             //执行下一个中间件
  11.             await _next.Invoke(content);
  12.         }
  效果如下:

 


  最后一个知识点就是用扩展方法和链式编程,封装自己的中间件

  同样也是在该文件夹下新建一个类:
   
  1.  public static class RequestIPMwExtensions
  2.     {
  3.         //用扩展方法和链式编程,封装自己的中间件
  4.         //扩展方法的标识:static ,this
  5.         public static IApplicationBuilder UseRequestIP(this IApplicationBuilder app)
  6.         {
  7.             //链式编程:(返回一个自己对象)
  8.             return app.UseMiddleware<RequestIPMiddleware>();
  9.         }
  10.         //中间件和过滤器的区别:
  11.         //1,过滤器还是中间件里面的一个小模块
  12.         //2,配置方式不同
  13.         //3,过滤器更贴近业务
  14.         //4,中间件更早
  15.     }
  最后在Startup.cs服务里的Configure方法调用即可。
 
  1.  //使用自己扩展方法的中间件
  2.    app.UseRequestIP();

好啦,本次文章分享就到这里了,喜欢的朋友可以加收藏哦。


评价

小可爱

2019/12/24 16:51:04

快把圣诞老人放出来[熊猫][熊猫]我们要圣诞礼物

陪你听风:@小可爱可以可以,今晚他就会来喽。

2019/12/25 14:43:32 回复

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
极霸矛,湘阿痕响啊。