• autofac通过aop对方法执行前后进行拦截(.net core)


    .net core中,如果想要在控制器请求前和请求后输出日志,是非常好实现的,直接使用拦截器就能达到目的。但是如果想要对服务层的方法进行拦截该如何实现呢?这里介绍使用autofac的方式实现。如果对autofac的使用不熟悉可以参考:https://www.cnblogs.com/duanjt/p/16246546.html。

    引入nuget包

    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.0.0" />
    <PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />

    定义接口类和实现类

    // 注意Intercept是核心,CacheInterception表示拦截类,后面会创建该类
    [Intercept(typeof(CacheInterception))]
    public interface IUsersBLL
    {
        public List<Users> GetAll();
    }
    
    public class UsersBLL : IUsersBLL
    {
        public virtual List<Users> GetAll()
        {
            return new List<Users>()
            {
                new Users(){Name="张三"},
                new Users(){Name="李四"}
            };
        }
    }

    定义拦截类CacheInterception

    /// <summary>
    /// 缓存拦截器,必须实现IInterceptor接口
    /// </summary>
    public class CacheInterception : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("执行前:" + invocation.Method.ReflectedType.FullName);
            invocation.Proceed();//执行
            Console.WriteLine("执行后:" + JsonConvert.SerializeObject(invocation.ReturnValue));
        }
    }

    最后就是在注入方法ConfigureContainer中修改

    public void ConfigureContainer(ContainerBuilder builder)
    {
        //EnableInterfaceInterceptors表示启用接口拦截
        builder.RegisterType<UsersBLL>().As<IUsersBLL>().EnableInterfaceInterceptors();
        //将拦截类注入到容器中
        builder.Register(c => new CacheInterception());
    }

    注意

    1.UsersBLL中的方法必须是虚方法

    2.[Intercept(typeof(CacheInterception))]也有另外一种写法,就是在注入时直接加上builder.RegisterType<UsersBLL>().As<IUsersBLL>().InterceptedBy(typeof(CacheInterception)).EnableInterfaceInterceptors()

  • 相关阅读:
    asp.net(.net 4.0)+ json 分页
    在两张表(A表和B表)里面找出A中不存在B表的记录
    linq to sql 的List<Table> 数据表缓存
    linq 并发冲突概念
    阿里RocketMq节约成本
    阿里巴巴java手册异常日志
    阿里巴巴java手册安全规约
    阿里巴巴java手册单元测试
    Spring boot自定义starter
    MongoDB权限
  • 原文地址:https://www.cnblogs.com/duanjt/p/16246701.html
Copyright © 2020-2023  润新知