简单了学习一下其他几种代理方式。其实是懒癌
先插入一个小tips:ProxyGenerationOptions,Interceptor[],InterceptorSelector 包含在代理类的Public字段中(proxyGenerationOptions,__selector,__interceptors),通过代理类的构造函数注入(不传InterceptorSelector,则不存在)
public class Engine : IEngine
{
public virtual int CallMethod(string parameter)
{
return parameter.Length;
}
}
public class AnsweringEngine : Engine
{
public override int CallMethod(string parameter)
{
return parameter.Length;
}
}
//这里代理Engine类时用其子类AnsweringEngine来作为具体的代理目标
var service = proxy.CreateClassProxyWithTarget<Engine>(new AnsweringEngine(), logInterceptor);
//代理IEngine接口,具体方法的实现在拦截器中处理,可以传入一个委托来代替拦截方法的实现
var service = proxy.CreateInterfaceProxyWithoutTarget<IEngine>(new MethodInterceptor(new GetAnswer((string parameter) => parameter.Length)));
//代理IEngine接口,用实现了该接口的AnsweringEngine类作为具体的代理目标
var service = proxy.CreateInterfaceProxyWithTarget<IEngine>(new AnsweringEngine(), interceptor);
//代理IEngine接口,代理目标也是IEngine接口,具体实现放在继承了IEngine接口的AnsweringEngine对象中
var service = proxy.CreateInterfaceProxyWithTargetInterface<IEngine>(new AnsweringEngine(), interceptor);
var options = new ProxyGenerationOptions();
options.AddMixinInstance(new AccountService()); //混合代理
var service = proxy.CreateClassProxy<Engine>(options);
ViewBag.Msg = service.CallMethod(name);
ViewBag.Msg = (service as IAccountService).GetUser(name);
其实感觉大部分情况下都只会用到最开始的类代理,剩下的这这几种作为了解,等到需要的时候再仔细研究。
学习到这里,可以看到Castle的动态代理主要在于多态和里氏替换原则的实际运用,最后配合Emit来动态生成我们想要的代码。
滚回去再看一遍设计模式啦
OO五大原则学起来简单,也容易理解,可是要怎样在实际代码中运用起来呢?阅读别人总结出来的智慧,是为了让我们在今后工作得更加高效,优雅,简洁,任重道远。