使用Castle做类的增强

我们已经实现了用户注册功能,现在想增加日志记录功能。具体来讲就是在用户注册前后,分别输出一条日志。我们当然可以修改原有的业务代码。

现在换个角度来问两个问题:
1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢?
2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢?

总结一下:
我们要在不修改原有类业务代码的前提下,去做类的增强。我们的设计要符合面向对象的原则:对扩展开放,对修改封闭

都有哪些办法呢?我们尝试以下几种方法:


原有业务类

业务模型

namespace testAopByDecorator
{
    public class User
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}

接口设计

namespace testAopByDecorator
{
    public interface IUserProcessor
    {
        void RegisterUser(User user);
    }
}

业务实现

using System;

namespace testAopByDecorator
{
    public class UserProcessor : IUserProcessor
    {
        public void RegisterUser(User user)
        {
            if (user == null)
            {
                return;
            }

            Console.WriteLine(string.Format("注册了一个用户{0}:{1}", user.Id, user.Name));
        }
    }
}

上层调用

using System;

namespace testAopByDecorator
{
    class Program
    {
        private static User user = new User { Id = 1, Name = "滇红" };

        static void Main(string[] args)
        {
            Register();
            Console.ReadKey();
        }

        private static void Register()
        {
            IUserProcessor processor = new UserProcessor();
            processor.RegisterUser(user);
        }
    }
}

使用Castle做类的增强

我们将使用第三方的Castle.Core来对原有的类做业务增强,首先使用NuGet安装。

业务增强实现

using System;
using Castle.DynamicProxy;

namespace testAopByCastle
{
    public class UserProcessorCastle : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            User user = invocation.Arguments[0] as User;

            before(user);
            invocation.Proceed();
            after(user);
        }

        private void after(User user)
        {
            Console.WriteLine("注册用户后:" + user.Name);
        }

        private void before(User user)
        {
            Console.WriteLine("注册用户前:" + user.Name);
        }
    }
}

需要原有业务类的方法声明为虚方法:virtual

using System;

namespace testAopByCastle
{
    public class UserProcessor : IUserProcessor
    {
        public virtual void RegisterUser(User user)
        {
            if (user == null)
            {
                return;
            }

            Console.WriteLine(string.Format("注册了一个用户{0}:{1}", user.Id, user.Name));
        }
    }
}

上层调用

using Castle.DynamicProxy;
using System;

namespace testAopByCastle
{
    class Program
    {
        private static User user = new User { Id = 1, Name = "滇红" };

        static void Main(string[] args)
        {
            RegisterAndLog();
            Console.ReadKey();
        }

        private static void RegisterAndLog()
        {
            ProxyGenerator generator = new ProxyGenerator();
            UserProcessorCastle castle = new UserProcessorCastle();
            IUserProcessor proxy = generator.CreateClassProxy<UserProcessor>(castle);
            proxy.RegisterUser(user);
        }
    }
}

对比一下扩展前后的业务展现

这种方式修改了原有业务类的方法,需要显示定义为virtual,不是很符合对修改关闭原则。不过我们要根据实际项目情况灵活把握。

时间: 2024-11-18 07:50:33

使用Castle做类的增强的相关文章

使用Unity做类的增强(续)

我们已经实现了用户注册功能,现在想增加日志记录功能.具体来讲就是在用户注册前后,分别输出一条日志.我们当然可以修改原有的业务代码. 现在换个角度来问两个问题: 1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢? 2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢? 总结一下: 我们要在不修改原有类业务代码的前提下,去做类的增强.我们的设计要符合面向对象的原则:对扩展开放,对修改封闭! 都有哪些办法呢?我们尝试以下几种方法: 使用装饰器模式做

使用Unity做类的增强

我们已经实现了用户注册功能,现在想增加日志记录功能.具体来讲就是在用户注册前后,分别输出一条日志.我们当然可以修改原有的业务代码. 现在换个角度来问两个问题: 1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢? 2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢? 总结一下: 我们要在不修改原有类业务代码的前提下,去做类的增强.我们的设计要符合面向对象的原则:对扩展开放,对修改封闭! 都有哪些办法呢?我们尝试以下几种方法: 使用装饰器模式做

使用.Net代理模式做类的增强

我们已经实现了用户注册功能,现在想增加日志记录功能.具体来讲就是在用户注册前后,分别输出一条日志.我们当然可以修改原有的业务代码. 现在换个角度来问两个问题: 1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢? 2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢? 总结一下: 我们要在不修改原有类业务代码的前提下,去做类的增强.我们的设计要符合面向对象的原则:对扩展开放,对修改封闭! 都有哪些办法呢?我们尝试以下几种方法: 使用装饰器模式做

使用装饰器模式做类的增强

我们已经实现了用户注册功能,现在想增加日志记录功能.具体来讲就是在用户注册前后,分别输出一条日志.我们当然可以修改原有的业务代码. 现在换个角度来问两个问题: 1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢? 2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢? 总结一下: 我们要在不修改原有类业务代码的前提下,去做类的增强.我们的设计要符合面向对象的原则:对扩展开放,对修改封闭! 都有哪些办法呢?我们尝试以下几种方法: 使用装饰器模式做

关于processing自己做类

问题描述 关于processing自己做类 其实是个小问题,问来也有点羞愧,但是真的找不到方法,只好麻烦各位大大解答了:就是processing中,自己做了一个类之后,怎么在别的文件里用这个类?C和C++的就是ifdef.endif processing真不知道 orz 求大大解答 ,谢谢了 解决方案 你要问什么 C++ 写一个类 需要头文件,在头文件中对类进行声明,cpp 文件中 实现类. 然后别的模块中 包含下类就可以调用.

虾米网的野心:做类淘宝音乐人平台

中介交易 SEO诊断 淘宝客 云主机 技术大厅 本报记者 薛娟 虾米网近日祭出被阿里巴巴并购之后的最大动作:推出虾米音乐人平台. 改变音乐产业链版权规则,让上游生产方音乐人真正赚到钱,是虾米网CEO王皓始终未改的初衷,"音乐人的获利应该由音乐消费者埋单." 让消费者买单的尴尬 7月,是高晓松口中网络音乐的免费截止日.但这注定只能是音乐人们一厢情愿的想法. 6月5日,王皓曾对外宣布,环球.索尼和华纳三大唱片公司给音乐网站施压,从这一天起,包括虾米.百度音乐.QQ音乐.酷狗.多米.酷我在内

如何在J2ME下利用Bouncy Castle做Elliptic Curve?

问题描述 如何在J2ME下利用BouncyCastle做EllipticCurve?BouncyCastle官方网上的J2me的package是不是没有EC的API在里面?有谁之前在J2ME下做过吗?希望分享下

网上购物商城如何做 类唯品秀网购模式革新

中介交易 SEO诊断 淘宝客 云主机 技术大厅 双11网购狂欢节刚过,各种营销数据,如单日成交额300亿,天猫淘宝成交近200亿等等闪爆人们的双眼,仿佛不知不觉中,人们的购物场已被圈定在了网络购物商城之上.网上购物本身拥有的成本优势,也使它较少受到经济环境的影响,即使在金融危机的背景下,依然保持着比较平稳的增长势头.正是这种良好的态势,让很多网上购物商城迷失,陷入各种价格战. 经过多年的增长,网上购物商城大军已颇具规模.在网络购物迅速发展.竞争激烈的今天,王付正认为"改革创新"才是网上

ArrayList类(增强版)_基础知识

Author:月影 From:http://bbs.51js.com/thread-66469-1-1.html 复制代码 代码如下: <script>  function ArrayList()  {    var ins = Array.apply(this, arguments);    ins.constructor = arguments.callee;    ins.base = Array;    ins.each = function(closure)    {      if