引用正确的库来实现AOP

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

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

Autofac.Extras.DynamicProxy

添加Nuget包:Autofac.Extras.DynamicProxy

定义一个拦截器类,实现IInterceptor

    public class TestInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("你正在调用方法 \"{0}\" 参数是 {1}... ",
invocation.Method.Name,
string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray())); invocation.Proceed(); Console.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
}
}

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

修改Startup的ConfigureContainer方法

  • 拦截器注册要在使用拦截器的接口和类型之前
public void ConfigureDevelopmentContainer(ContainerBuilder builder)
{
// 要先注册拦截器
builder.RegisterType<TestInterceptor>(); builder.RegisterType<TopicService>().As<ITopicService>().EnableInterfaceInterceptors(); //如果需要在Controller中使用属性注入,需要在ConfigureContainer中添加如下代码
var controllerBaseType = typeof(ControllerBase); builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired()//允许属性注入
.EnableClassInterceptors();// 允许在Controller类上使用拦截器
}

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

在需要使用拦截器的类或接口上添加描述

[Intercept(typeof(TestInterceptor))]
  1. 自定义服务上使用拦截器

    我这里是定义了一个接口,如下:
[Intercept(typeof(TestInterceptor))]
public interface ITopicService
{
int Add(int a, int b);
}

定义一个实现接口的类

 public class TopicService:ITopicService
{
public int Add(int a,int b)
{
return a + b;
}
}

然后我们运行代码.

效果如下:

  1. 在Controller上使用拦截器
[Intercept(typeof(TestInterceptor))]
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ITopicService _service; public HomeController(ILogger<HomeController> logger,ITopicService service)
{
_logger = logger;
_service = service;
} public IActionResult Index()
{
return View();
}
}

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

Autofac的AOP拦截器还有很多功能与用法.我这里就不一一举例了。

其实asp.net core自带的过滤器也够用了,这里只是记录下不同的实现方式。

动态代理的高级用法

一个接口多个实现

AspNetCore3.0中

public interface ITestUtil
{
void Show(string content);
} public class TestUtil1 : ITestUtil
{
public void Show(string content)
{
Console.WriteLine("TestUtil1:" + content);
}
} public class TestUtil2 : ITestUtil
{
public void Show(string content)
{
Console.WriteLine($"TestUtil2:{content}");
}
}

别忘了在Startup中注册服务

builder.RegisterType<TestUtil1>().As<ITestUtil>();
builder.RegisterType<TestUtil2>().As<ITestUtil>();

在控制器中使用

// 默认情况下,构造函数注入和属性注入的结果都是最后注册的那个实现,
// 也就是TestUtil2
private readonly ITestUtil _util; public HomeController(ITestUtil util, IServiceProvider provider)
{
_util = util;
// 如果知道注册的顺序,可以用这种方式,
// 第一个注册是TestUtil1,所以这里返回TestUtil1
var util1 = provider.GetServices<ITestUtil>().ElementAtOrDefault(0);
util1?.Show("指定注册为ITestUtil的第一个实现"); // 一般情况下用这种方式,指定成具体的类型 TestUtil1
var utilFirst = provider.GetServices<ITestUtil>()
.SingleOrDefault(t => t.GetType() == typeof(TestUtil1));
util1?.Show("指定名称为TestUtil的实现");
}

Asp.net Core AOP实现(采用Autofac)的更多相关文章

  1. ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported.

    ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported ...

  2. asp.net core 四 IOC&DI Autofac

    其实关于IOC,DI已经有了很多的文章,但是自己在使用中还是有很多困惑,而且相信自己使用下,印象还是会比较深刻的 关于这段时间一直在学习.net core,但是这篇文章是比较重要的,也是我自己觉得学习 ...

  3. ASP.NET Core修改IOC为Autofac

    如下是我为了了解如何更换ASP.NET Core中的IOC而查找的文章,如果大家英文OK的,可以直接前往阅读,同时也已经有简单的github例子供大家参考. 参考文章: ASP.NET Core文档: ...

  4. Asp.net Core依赖注入(Autofac替换IOC容器)

    ASP.NET Core ASP.NET Core (previously ASP.NET 5) 改变了以前依赖注入框架集成进ASP.NET的方法. 以前, 每个功能 - MVC, Web API, ...

  5. ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

    在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...

  6. ASP.NET Core搭建多层网站架构【9.1-使用Autofac代替原生的依赖注入】

    2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1 摘要:基于ASP.NET Core ...

  7. ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

    在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入,本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入. 约定: 1.仓储层接口 ...

  8. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

    本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之 ...

  9. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

随机推荐

  1. css引入方式和基本样式

    css的三种引入方式: 1.内嵌:直接在标签中添加style属性 格式:<标签名 style="样式1:样式值1:样式2=样式值2:"></标签名> 2.内 ...

  2. JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...

  3. Qcom平台RTC驱动分析

    相关文件list: pm8998.dtsi ---RTC dts配置 qpnp-rtc.c ---qcom RTC驱动 class.c ---RTC相关class interface.c ---相关R ...

  4. LeetCode 74,直击BAT经典面试题

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题43篇文章,我们今天来看一下LeetCode当中的74题,搜索二维矩阵,search 2D Matrix. 这题的 ...

  5. Java实现 LeetCode 599 两个列表的最小索引总和(使用hash提高效率)

    599. 两个列表的最小索引总和 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅 ...

  6. Java实现 LeetCode 535 TinyURL 的加密与解密(位运算加密)

    535. TinyURL 的加密与解密 TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它 ...

  7. Java实现 LeetCode 429 N叉树的层序遍历

    429. N叉树的层序遍历 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明 ...

  8. Java实现 LeetCode 135 分发糖果

    135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...

  9. Java实现LeetCode_0001_Two Sum

    import java.util.Arrays; import java.util.Scanner; public class TwoSum_1 { public static void main(S ...

  10. Java实现 蓝桥杯 历届试题 带分数

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...