using AspectCore.DynamicProxy;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading.Tasks;
using AspectCore.Extensions.DependencyInjection;
using System.Collections.Generic;
namespace MyConsoleApp3
{
class Program
{
static void Main(string[] args)
{
ServiceCollection service = new ServiceCollection();
//注册服务
//service.AddDynamicProxy();旧的方法
service.ConfigureDynamicProxy();
service.AddTransient<IMySql, MySql>();
//var provider = service.BuildAspectCoreServiceProvider();旧的方法
var provider = service.BuildDynamicProxyProvider();
var mysql = provider.GetService<IMySql>();
//走业务逻辑
var msg = mysql.GetData(10);
Console.WriteLine(msg);
//走缓存
msg = mysql.GetData(10);
Console.WriteLine(msg);
Console.Read();
}
}
/// <summary>
/// 日志切面
/// </summary>
public class MyLogInterceptorAttribute : AbstractInterceptorAttribute
{
public override Task Invoke(AspectContext context, AspectDelegate next)
{
Console.WriteLine("开始记录日志");
var task = next(context);
Console.WriteLine("结束记录日志");
return task;
}
}
/// <summary>
/// 缓存切面
/// </summary>
public class MyCacheInterceptorAttribute : AbstractInterceptorAttribute
{
private Dictionary<string, string> cacheDict = new Dictionary<string, string>();
public override Task Invoke(AspectContext context, AspectDelegate next)
{
var cacheKey = string.Join(",",context.Parameters);
if (cacheDict.ContainsKey(cacheKey))
{
context.ReturnValue = cacheDict[cacheKey].ToString();
return Task.CompletedTask;
}
var task = next(context);
var cacheValue = context.ReturnValue;
cacheDict.Add(cacheKey,string.Format("from cache:{0}", cacheValue.ToString()));
return task;
}
}
public interface IMySql
{
string GetData(int id);
}
public class MySql : IMySql
{
[MyLogInterceptor]
[MyCacheInterceptor]
public string GetData(int id)
{
var msg = $"已经获取到数据id={id}的数据";
Console.WriteLine(msg);
return msg;
}
}
}