在NETCORE中可以使用AOP的方式有很多很多,包括国内优秀的开源框架asp.netcore同样可以实现AOP编程模式。
IOC方面,个人喜欢net core 3自带的DI,因为他注册服务简洁优雅,3个生命周期通俗易懂,所以就没使用autofac等其他容器,AOP方面,使用了AspectCore 所以要在nuget中添加AspectCore.Extensions.DependencyInjection的依赖包,这里大家可能会有疑问,利用mvc的actionFilter不就可以实现了么,为什么还要引用DP呢,因为呀,actionFilter只在controller层有效,普通类他就无能为力了,而DP无所不能。
步骤1、安装 AspectCore.Extensions.DependencyInjection 1.3.0 Nuget包
步骤2、修改 Program.cs
using AspectCore.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebApplication4
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
// for aspcectcore
.UseServiceProviderFactory(new AspectCoreServiceProviderFactory());
}
}
备注:加入 此处解决 下面这个问题
System.NotSupportedException:“ConfigureServices returning an System.IServiceProvider isn't supported
步骤3、添加 CustomInterceptorAttribute.cs 类文件
using AspectCore.DynamicProxy;
using System;
using System.Threading.Tasks;
namespace WebApplication4.Aop
{
public class CustomInterceptorAttribute : AbstractInterceptorAttribute
{
public async override Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
Console.WriteLine("Before service call");
await next(context);
}
catch (Exception)
{
Console.WriteLine("Service threw an exception!");
throw;
}
finally
{
Console.WriteLine("After service call");
}
}
}
}
步骤4、实现特性拦截的方式:
using System.Collections.Generic;
using WebApplication4.Aop;
namespace WebApplication4.App
{
public class StudentRepository : IStudentRepository
{
[CustomInterceptor]
public List<Student> GetAllStudents()
{
var students = new List<Student>();
students.Add(new Student { Name = "Panxixi", Age = 11 });
students.Add(new Student { Name = "Liuchuhui", Age = 12 });
return students;
}
}
}
最后、 提供 AspectCore 的 4个demo:
-
InterceptorAttribute demo (特性拦截)
-
GlobalInterceptor demo (全局拦截)
-
NonAspect demo (忽略拦截)
-
DependencyInjection demo
连接地址:https://github.com/fs7744/AspectCoreDemo
原文出处:https://www.cnblogs.com/panxixi/p/11905006.html
来源:oschina
链接:https://my.oschina.net/u/4264835/blog/3246700