netcore使用AutoFac实现AOP

时间:2020-03-08
本文章向大家介绍netcore使用AutoFac实现AOP,主要包括netcore使用AutoFac实现AOP使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

第一步,添加程序集引用

在Nuget中搜索autofac找到Autofac.Extras.DynamicProxy并安装。

 第二步:添加拦截器

/// <summary>
    /// 拦截器(实现 Castle.DynamicProxy.IInterceptor)接口
    /// </summary>
    public class CustomAutoFacAOPInterception : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("执行之前可以写日志、参数检查……");
       //可以捕获异常 invocation.Proceed(); Console.WriteLine(
"执行之后可以写日志……"); } } /// <summary> /// person服务接口 /// </summary> public interface IPerson { string Speak(); } /// <summary> /// 接口的实现类 /// 注意,与Unity实现aop不同,autofac是作用于实现类而不是接口 /// </summary> [Intercept(typeof(CustomAutoFacAOPInterception))] public class Person : IPerson { public string Speak() { return "你好,我是一个Person"; } }

第三步,在注册模块注册拦截器并启用AOP拦截

/// <summary>
    /// AutoFac注册模块
    /// </summary>
    public class CustomAutoFacModule: Autofac.Module
    {
       /// <summary>
       /// 重写父类的Load方法
       /// </summary>
       /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            //1、注册拦截器
            builder.Register(a => new CustomAutoFacAOPInterception());
            //2、设置该类型允许AOP拦截
            builder.RegisterType<Person>().As<IPerson>().EnableInterfaceInterceptors().SingleInstance();
            builder.RegisterType<UserProvider>().As<IUserService>().SingleInstance();//感叹,这语法,真的是不能再爽了
            //后面可以注册好多类型……
            //后面可以注册好多类型……
            //后面可以注册好多类型……
            //后面可以注册好多类型……
        }
    }

第四步,调用

 public class InterceptDemoController : Controller
    {
        private IPerson _personService = null;
        /// <summary>
        /// 构造注入
        /// </summary>
        /// <param name="person"></param>
        public InterceptDemoController(IPerson person)
        {
            _personService = person;
        }
        public IActionResult Index()
        {
            string rel = _personService.Speak();
            return Content(rel);
        }
    }

原文地址:https://www.cnblogs.com/chenxizhaolu/p/12442528.html