net core 3.1使用autofac及Castle实现Aop切面编程

构建基本项目及引入需要的包文件

autofac在net core 3.1的使用上与2.2有不同,所以在这里记录一下。

先创建一个简单的demo项目,控制台程序及api或者mvc模式都可以。

依次引入依赖包:

Autofac:提供容器控制
Autofac.Extensions.DependencyInjection:对autofac依赖注入进行扩展
Autofac.Extras.DynamicProxy:对autofac动态代理进行扩展
Castle.Core:使用动态代理的实现

  

版本有不一致没关系,这里我加载的是对应的最新的包。

项目中使用

项目中使用有两个地方要注意:

1.在Program.cs的程序入口要指定使用autofac容器

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())  //指定使用autofac
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

2.在Startup的启动文件中新增容器入口ConfigureContainer,默认方法及参数不得修改

在这里我创建了一个接口ISay及实现方法Say,注入到容器中。

对应代码

public interface ISay
    {
        PeopleEntity SayHello(PeopleEntity peopleEntity);
    }

[Intercept(typeof(InjectInterceptor))]
    public class Say : ISay
    {
        public PeopleEntity SayHello(PeopleEntity peopleEntity)
        {
            peopleEntity.Name = $"hello {peopleEntity.Name}";
            return peopleEntity;
        }
    }

在这里我们使用的时候在控制器直接注入使用就行了

在这里简单的使用autofac的容器使用就完成了。

下面我们来使用Castle来实现aop的使用

新建一个拦截器类,名为InjectInterceptor,而且必须要实现IInterceptor(该接口在Castle.DynamicProxy中),即Intercept虚方法,该方法将传递IInvocation接口参数。

public class InjectInterceptor : IInterceptor
    {
        public virtual void Intercept(IInvocation invocation)
        {
            PreProceed(invocation);
            invocation.Proceed();
            Console.WriteLine(invocation.ReturnValue);
            PostProceed(invocation);
        }

        private void PreProceed(IInvocation invocation)
        {
            Console.WriteLine($"{DateTime.Now} interceptor invoke start");
        }

        private void PostProceed(IInvocation invocation)
        {
            Console.WriteLine($"{DateTime.Now} interceptor invoke end");
        }
    }

  在这里,我标记Say的方法,这里指明Intercept只能标记类或接口,不能标记特定的方法,所以你标记对应的类或接口时,内部的方法都会被拦截。

 [Intercept(typeof(InjectInterceptor))]
    public class Say : ISay

  在这里说明,这里是配合autofac使用的所以需要在Startup中的ConfigureContainer方法中注册拦截方法及注册这个Say方法时要开启允许方法拦截。

builder.RegisterType<InjectInterceptor>();
builder.RegisterType<Say>().As<ISay>().EnableInterfaceInterceptors();

  嗯,就这样。

原文地址:https://www.cnblogs.com/xianz/p/12315347.html

时间: 2024-08-14 08:50:21

net core 3.1使用autofac及Castle实现Aop切面编程的相关文章

NET Core 整合Autofac和Castle

NET Core 整合Autofac和Castle 阅读目录 前言: 1.ASP.NET Core中的Autofac 2.整合Castle的DynamicProxy 3.注意事项 回到目录 前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 回到目录 1.ASP.NET Core中的Autofac 首先在Project.json的Dependency节点为中添

.NET 通过 Autofac 和 DynamicProxy 实现AOP

什么是AOP?引用百度百科:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.实现AOP主要由两种方式,一种是编译时静态植入,优点是效率高,缺点是缺乏灵活性,.net下postsharp为代表者(这个是收费的).另一种方式是动态代理,优缺点与前者相反,动态为目标类型创建代理,通过代理调用实现拦截.AOP能做什么,常见的用例是事务处理.日志记录等等.下面就讲讲Autofac怎么实现AOP,Aut

Autofac的AOP面向切面编程研究

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none; } .markdown-body .anchor { float: left; padding-right: 4px; margin-left: -2

切面编程AOP之Castle.Core

1.Nuget中搜索Castle.Core并install 2.创建一个普通的类(注意类中只有标记virtual才能实现拦截 ) public class TestInterceptor { public virtual void MethodInterceptor() { Console.WriteLine("走过滤器"); } public void NoInterceptor() { Console.WriteLine("没走过滤器"); } } 3. 创建拦

.net core 注入机制与Autofac

本来是要先出注入机制再出 管道 的,哈哈哈……就是不按计划来…… 这里扯扯题外话:为什么要注入(DI,dependency-injection),而不用 new 对象? 可能我们都很清楚,new 对象所造成的影响就是耦合度太高,DI 就是用来解耦的.或者还可以说,DI 可以统一进行管理对象. 此话怎讲呢? 这里还要扩展一下,讲一下接口(Interface)跟类(Class): 接口的话通常都像 IDisposable.IEnumerable 或者 ICollection 这些一样以 " I &q

net core WebApi——依赖注入Autofac

目录 前言 Autofac 添加一个Util来随时调用 小结 代码地址 预告 前言 周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了. Autofac 这个第三方类库呢,是Ioc的容器,可以简化我们很大的工作量,比如说在之前我们需要写个类去声明接口与实现,而用了这个容器呢,就不需要了,当然还是需要些配置的. 首先,引入第三方类库,不多说. 然后开始配置吧,首

NET Core 3.1 基于Autofac 的缓存AOP

缓存功能,一般咱们都是将数据获取到以后,定义缓存,然后在其他地方使用的时候,在根据key去获取当前数据,然后再操作等等,平时都是在API接口层获取数据后进行缓存,今天咱们可以试试,在接口之前就缓存下来. 1.定义 Memory 缓存类和接口 /// <summary> /// 简单的缓存接口,只有查询和添加,以后会进行扩展 /// </summary> public interface ICaching { object Get(string cacheKey); void Set

ASP.NET Core搭建多层网站架构【8-使用AOP动态拦截器进行服务层日志记录】

2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[7-编写角色业务的增删改查] 编写最简单的增删改业务,涉及到DI依赖注入的使用.AutoMapper的使用.工作单元与仓储的使用.雪花Id的生成 文章目录 此分支项目代码 本章节介绍了编写最简单的增删改查业务,涉及到DI依赖注入的使用.AutoMapper的使用.工作单元与仓储的使用 原文地址:https://www.cnblogs.com/ka

从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

代码已上传Github,文末有地址 说接上文,上回说到了<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之八 || API项目整体搭建 6.3 异步泛型+依赖注入初探>,后来的标题中,我把仓储两个字给去掉了,因为好像大家对这个模式很有不同的看法,嗯~可能还是我学艺不精,没有说到其中的好处,现在在学DDD领域驱动设计相关资料,有了好的灵感再给大家分享吧. 到目前为止我们的项目已经有了基本的雏形,后端其实已经可以搭建自己的接口列表了,框架已