Unity实现AOP
记录一点在用Unity实现AOP时候遇到的坑。
版本问题
目前Unity最新的版本是5.11.1,同时Unity.Interception的最新版本也是5.11.1,于是我就安装了这两个最新版本,可是代码写好了却怎么也执行不到自定义的Attribute。不知道是不是最近版本的写法不一样了还是不兼容了,网上查了许多资料没找到相关的解释。如果有哪位大神知道解决方法欢迎留言指点,万分感谢。
新版本不支持,于是我只能回归到原始版本。经过几次尝试最后确定了可执行的版本:
Unity: v5.5.0
Unity.Interception: v5.2.1
代码实现
接下来通过一个简单手机类来演示一下AOP的实现。先定义一个简单的手机接口
public interface IPhone
{
void Call();
}
写一个安卓手机类实现手机接口
public class AndroidPhone : IPhone
{
public void Call()
{
Console.WriteLine("Android Call ");
}
}
接下来是AOP功能实现,没有任何逻辑处理知识做个简单地演示。
public class PhoneHandler : ICallHandler
{
public int Order { get; set; }
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("PhoneHandler");
return getNext()(input, getNext);
}
}
public class PhoneHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
ICallHandler handler = new PhoneHandler() { Order = this.Order };
return handler;
}
}
接下来只要Iphone接口实现PhoneHandlerAttribute就行,Order是排序,如果有多个Attribute可是用来设置执行顺序。
[LogHandler(Order = 1)]
public interface IPhone
{
void Call();
}
最后通过注入的方式实例化Phone方法并调用Call方法
IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, AdroidPhone>();
//设置执行AOP
container.AddNewExtension<Interception>()
.Configure<Interception>()
.SetInterceptorFor<IPhone>(new InterfaceInterceptor());
var phone = container.Resolve<IPhone>();
phone.Call();