使用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,不是很符合对修改关闭原则。不过我们要根据实际项目情况灵活把握。

相关文章
|
传感器 5G UED
5G 标准化进程|带你读《5G空口特性与关键技术》之二
从 2016 年起,3GPP 启动了 R14 研究项,目标是在 2020 年实现 5G 的商业化部署。为此,3GPP 采取了按阶段定义规范的方式。第一阶段目标是R15,旨在完成规范 5G 的有限功能。第二阶段是 R16,旨在完成规范 IMT-2020 所定义的所有功能,将于 2019 年年底到 2020 年完成。
5G 标准化进程|带你读《5G空口特性与关键技术》之二
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
767 0
|
机器学习/深度学习 人工智能 自然语言处理
PGL图学习之图神经网络GNN模型GCN、GAT[系列六]
本次项目讲解了图神经网络的原理并对GCN、GAT实现方式进行讲解,最后基于PGL实现了两个算法在数据集Cora、Pubmed、Citeseer的表现,在引文网络基准测试中达到了与论文同等水平的指标。 目前的数据集样本节点和边都不是很大,下个项目将会讲解面对亿级别图应该如何去做。
|
监控 项目管理 开发者
『软件工程7』详解软件项目管理之风险分析与管理
该文章详细讲解了软件项目管理中的风险分析与管理,包括风险的定义、类型、管理流程以及如何建立和使用风险表来跟踪和处理潜在风险。
|
7月前
|
运维 Prometheus 监控
基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践
基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践
284 1
|
小程序 JavaScript 开发者
微信小程序分包的相关概念和使用
本文介绍了微信小程序分包的概念、优势、配置方法、加载规则、体积限制,以及独立分包和分包预下载的配置,旨在帮助开发者优化小程序的加载速度和开发效率。
|
人工智能 弹性计算 自然语言处理
快速部署 MaxKB 社区版
MaxKB = Max Knowledge Base,是一款基于 LLM 大语言模型的开源知识库问答系统,旨在成为企业的最强大脑。本文介绍如何使用计算巢快速部署 MaxKB 社区版。
快速部署 MaxKB 社区版
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
231 0
|
传感器 语音技术
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结-2
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结
STM32智能小车(循迹、跟随、避障、测速、蓝牙、wife、4g、语音识别)总结-2