.net core 2.1 AOP 切面编程,MVC和控制台例子

先来个MVC版本的

1:Nuget引入 AspectCore.Extensions.DependencyInjection

2:Startup 类中设置IServiceProvider

public IServiceProvider provider { get; set; }

3:Startup 类ConfigureServices方法注册服务

services.AddScoped<IHuman, Man>();

services.AddDynamicProxy();//注册AOP服务

provider = services.BuildAspectCoreServiceProvider();

4:Startup 类Configure方法,把IServiceProvider写入缓存

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache memoryCache)

{

。。。

memoryCache.Set<IServiceProvider>("provider", provider);

}

 

5:Controller中调用

public class TestController : Controller

{

IMemoryCache _memoryCache;

public TestController(IMemoryCache memoryCache)

{

_memoryCache = memoryCache;

}

 

[HttpGet]

public void ManTest()

{

var provider = _memoryCache.Get<IServiceProvider>("provider");

var man = provider.GetService<IHuman>();

man.DoSomeThing();

}

}

 

6:附上例子中用到的类

public interface IHuman

{

void DoSomeThing();

}

 

public class Man : IHuman

{

[MyLogInterceptor]

public void DoSomeThing()

{

Console.WriteLine("我是男人,我可以赚很多钱。");

}

}

 

public class MyLogInterceptorAttribute : AbstractInterceptorAttribute

{

public override Task Invoke(AspectContext context, AspectDelegate next)

{

Console.WriteLine("开始记录日志。。。。。。");

//继续执行

var task = next(context);

Console.WriteLine("结束记录日志。。。。。。");

return task;

}

}

 

 

 

控制台版本的

static void Main(string[] args)

{

//IOC容器

ServiceCollection services = new ServiceCollection();

//注册服务

services.AddDynamicProxy();

 

services.AddTransient<IMySql, MySql>();

var provider = services.BuildAspectCoreServiceProvider();

var mysql = provider.GetService<IMySql>();

 

mysql.GetData(10);

 

Console.Read();

}

 

public interface IMySql

{

string GetData(int id);

}

public class MySql : IMySql

{

[MyLogInterceptor]

public string GetData(int id)

{

var msg = $"已经获取到数据id={id}的数据";

 

Console.WriteLine(msg);

 

return msg;

}

}

public class MyLogInterceptorAttribute : AbstractInterceptorAttribute

{

public override Task Invoke(AspectContext context, AspectDelegate next)

{

Console.WriteLine("开始记录日志。。。。。。");

//继续执行

var task = next(context);

Console.WriteLine("结束记录日志。。。。。。");

return task;

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值