• ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)


    前言

    本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截

    觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐

    这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.

    目录

    ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    正文

    上一篇我们讲了如何将默认的容器替换为Autofac,并使用属性注入.

    那么这一篇我们就来讲讲如何利用Autofac实现我们的AOP(面向切面编程) .

    1.引用正确的库来实现AOP

    既然是跨平台,那么在asp.net core因为采用了.net core来作为基础库(当然,其实你可以换成.NET4.6.).

    新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题.

    在传统的ASP.NET中,使用过Autofac来进行AOP操作的,应该都知道这个库.

    Autofac.Extras.DynamicProxy

    那么我们来看看它的依赖项.如图:

    .NET Standard的情况下,他需要Autofac4.0+,这个就不多说了.关键在下面这个,他需要Castle.Core4.0+.

    所以,当我们直接安装这个库的时候,Nuget会自动关联并安装最新的Castle.Core4.2.1版本..

    那么问题就出现了..在项目的依赖项中,会发现很多警告:

    我们进入警告会发现..都是提示缺少兼容的最新的类型转换类.如图:

    而且Castle.Core是属于AutoFac下面的..如图:

    我们直接通过Nuget查找Castle.Core.

    可以发现,它需要System.ComponentModel.TypeConverter4.3..

    我们直接安装它,Nuget则会直接帮我们把System.ComponentModel.TypeConverter更新到4.3的版本..

    然后重新通过Nuget安装Autofac.Extras.DynamicProxy..就可以了.如图:

    其实这应该算一个Nuget的BUG..它会帮你引用库的相关依赖..但是当依赖还有依赖需要更新的时候..它就不会更新..

    这个时候我们换一种思维..返回来 一步步引用.就可以了..

    2.采用Autofac来实现AOP

    首先,我们创建一个拦截类,代码如下:

     public class AOPTest : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                System.Diagnostics.Debug.WriteLine("你正在调用方法 "{0}"  参数是 {1}... ",
                   invocation.Method.Name,              
                   string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
                //在被拦截的方法执行完毕后 继续执行           
                invocation.Proceed();
    
                System.Diagnostics.Debug.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
            }
        }

    这里,需要继承IInterceptor,然后实现它的Intercept方法..我们直接将拦截内容输出到调试窗(正式项目..请根据业务来操作拦截)..

    找到我们要拦截的服务.并设置拦截特性(有多种方式.用特性的方式作为例子..个人也觉得特性AOP拦截比较方便),代码如下:

        [Intercept(typeof(AOPTest))]
        public class TestService: ITestService
        {
            public TestService()
            {
                MyProperty = Guid.NewGuid();
            }
            public Guid MyProperty { get; set; }
            public List<string> GetList(string a)
            {
                return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
            }
        }

    然后在容器中注入我们的AOP拦截类,并开启服务的拦截状态.代码如下:

       public class DefaultModule : Module
        {
            protected override void Load(ContainerBuilder builder)
            {
    
                builder.Register(c => new AOPTest());
                builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired().EnableInterfaceInterceptors();
            }
        }

    这里注意,一定要在你注入的服务后面加上EnableInterfaceInterceptors来开启你的拦截.

    然后在控制器中调用服务的方法,代码如下:

    public class AutoDIController : Controller
        {
    
            public  ITestService _testService { get; set; }
    
            
            // GET: AutoDI
            public ActionResult Index()
            {
                ViewBag.date = _testService.GetList("Name");
                return View();
            }
    }

    然后我们运行代码.

    效果如下:

    这样,我们就完成了使用Autofac进行AOP拦截..

    Autofac的AOP拦截器还有很多功能与用法.我这里就不一一举例了..请参考官网:http://docs.autofac.org/en/latest/advanced/interceptors.html

    写在最后

    三部曲到此就结束了.  喜欢的请点个推荐和关注,~有问题也希望各位批评指正~.

  • 相关阅读:
    2019互联网安全城市巡回赛·西安站圆满收官
    跨域漏洞丨JSONP和CORS跨域资源共享
    浅谈URL跳转与Webview安全
    事务嵌套的问题
    小代码编写神器:LINQPad 使用入门
    重构指导之一
    视频的文件格式、压缩格式、码率、分辨率
    Asp.Net中自以为是的Encode
    Solution Explorer 和 Source Control Explorer 的 View History 异同
    借助 Resharper 和 StyleCop 让代码更整洁
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/8309645.html
Copyright © 2020-2023  润新知