寫(xiě)在前面
在上一篇中對(duì)AspectCore進(jìn)行了初步的了解,用于攔截的屬性加在了具體類(lèi)的方法上。
C# 面向切面編程之AspectCore初探
這一篇驗(yàn)證一下把攔截屬性加在接口上,這樣實(shí)現(xiàn)該接口的類(lèi)中所對(duì)應(yīng)的方法都會(huì)被攔截到;另外示例中還嘗試對(duì)方法的入?yún)⑦M(jìn)行了修改,驗(yàn)證了通過(guò)AspectContext可以獲得當(dāng)前方法的所有信息。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796604.html
代碼實(shí)現(xiàn)
using AspectCore.DynamicProxy;
using AspectCore.DynamicProxy.Parameters;
class Program
{
static void Main(string[] args)
{
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build();
SampleInterface sampleInterface = proxyGenerator.CreateInterfaceProxy<SampleInterface, SampleClass>();
Console.WriteLine(sampleInterface);
var ret = sampleInterface.Foo(1);
Console.WriteLine("ret:" + ret);
sampleInterface.Boo();
Console.ReadKey();
}
}
public class SampleInterceptor : AbstractInterceptorAttribute
{
public override Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
Console.WriteLine("Call Interceptor Start");
if (context.ImplementationMethod.Name.Equals("Foo"))
{
if (context.Parameters.Length > 0)
{
Console.WriteLine($"Foo Parameter Value[0]:{context.Parameters[0]}");
context.Parameters[0] = 2;
}
var returnParam = context.GetReturnParameter();
if (returnParam != null)
{
Console.WriteLine($"return type: {returnParam.Type.Name}");
}
}
return context.Invoke(next);
}
catch (Exception ex)
{
throw;
}
finally
{
Console.WriteLine("Call Interceptor End");
}
}
}
public class SampleClass : SampleInterface
{
public virtual int Foo(int a)
{
Console.WriteLine("Call Foo:" + a);
return 1;
}
public virtual void Boo()
{
Console.WriteLine("Call Boo");
}
}
[SampleInterceptor]
public interface SampleInterface
{
int Foo(int a);
void Boo();
}
調(diào)用示例
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796604.html
到了這里,關(guān)于C# 面向切面編程之AspectCore實(shí)踐(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!