Castle 学习 之 动态代理(3)

简单了学习一下其他几种代理方式。其实是懒癌

先插入一个小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(new AnsweringEngine(), logInterceptor);
    
    //代理IEngine接口,具体方法的实现在拦截器中处理,可以传入一个委托来代替拦截方法的实现
    var service = proxy.CreateInterfaceProxyWithoutTarget(new MethodInterceptor(new GetAnswer((string parameter) => parameter.Length)));
    
    //代理IEngine接口,用实现了该接口的AnsweringEngine类作为具体的代理目标
    var service = proxy.CreateInterfaceProxyWithTarget(new AnsweringEngine(), interceptor);
    
    //代理IEngine接口,代理目标也是IEngine接口,具体实现放在继承了IEngine接口的AnsweringEngine对象中
    var service = proxy.CreateInterfaceProxyWithTargetInterface(new AnsweringEngine(), interceptor);
    
    var options = new ProxyGenerationOptions();
    options.AddMixinInstance(new AccountService()); //混合代理
    var service = proxy.CreateClassProxy(options);

    ViewBag.Msg = service.CallMethod(name);
    ViewBag.Msg = (service as IAccountService).GetUser(name);

其实感觉大部分情况下都只会用到最开始的类代理,剩下的这这几种作为了解,等到需要的时候再仔细研究。

学习到这里,可以看到Castle的动态代理主要在于多态和里氏替换原则的实际运用,最后配合Emit来动态生成我们想要的代码。

滚回去再看一遍设计模式啦

OO五大原则学起来简单,也容易理解,可是要怎样在实际代码中运用起来呢?阅读别人总结出来的智慧,是为了让我们在今后工作得更加高效,优雅,简洁,任重道远。

你可能感兴趣的:(Castle 学习 之 动态代理(3))