最近在思考通用组件库的设计。
考虑到项目中一些功能的重复使用,需要将它们封装起来,做成组件的方式,提供代码的复用性。
在公用组件的封装中,日志记录是比较典型的一个。通常日志记录的形式很多,但是在一个项目中的使用形式很单一。但是,现在的项目,需要提供多种日志记录的实现。记录进平面文件、记录进数据库,记录的时候根据业务不同,还有其他的区分等。
设计的时候需要提供充分的可扩展性,以后有可能还要增加其他的记录形式。
日志类的设计,采用的是策略模式:
简单实现如下:
抽象基类: namespace ConsoleApplication1 { public abstract class Logger { public virtual void Log() { Console.WriteLine("This is the base class's logger"); } } } 定义了一个虚方法Log
文件记录类: namespace ConsoleApplication1 { internal class FileLogger : Logger { public override void Log() { Console.WriteLine("This is the file Logger"); } } } 继承了抽象基类,同时覆盖了基类的Log方法,提供了自己的实现。
数据库记录类: namespace ConsoleApplication1 { internal class DBLogger:Logger { public override void Log() { Console.WriteLine("This is the DB Logger."); } } } 同上,不解释
事件记录类: namespace ConsoleApplication1 { internal class EventLogger : Logger { public override void Log() { Console.WriteLine("This is the event logger"); } } } 可以看到这些子类的访问修饰符都定义为internal,也就是说,这些"算法"[沿袭策略模式的叫法,虽然有些不大恰当]没有就必要被组件外部访问。组件外部统一通过抽象类进行访问。
很显然,这里出现了一系列的同级别的功能相似的派生类,我们可以用工厂来管理他们的创建。
同时,我们想到面向对象的一个原则--开放封闭原则。也就是对扩展开放,对修改封闭。我们想要在修改的时候将改动的范围缩得越小越好。
如果采用普通的静态工厂类,通过传递硬编码的字符串的标识来判断应该实例化哪个类的话。形如下实现方式: public static Logger CreateLoggerInstance_Old(string loggerType) { Logger myLogger = null; switch (loggerType) { case "File": myLogger = new FileLogger(); break; case "DB": myLogger = new DBLogger(); break; case "Event": myLogger = new EventLogger(); break; default: break; } return myLogger; } 那么我们要新增一个日志记录方案的改动就会非常多:
1、你必须再去实现一个新的日志记录派生类,继承自Logger,去实现新的"算法"逻辑。
2、修改如上类库的实例化派生类对象的方法,再增加一个新的case语句。
3、当然客户端也得做出应变。
其实,我们可以动态地将类型传递给实例化派生类对象的方法,这样就不需要采取上面的"匹配机制",简易实现如下: public static Logger CreateLoggerInstance(string classNameForLogger) { Type loggerType = Type.GetType(classNameForLogger); if (loggerType!=null) { return Activator.CreateInstance(loggerType) as Logger; } return null; } 这样我们就永远也不用再来修改这个方法了。
在客户端(调用端),我们可以将需要用到的不同的日志记录类的类型信息通过配置的方式配置在配置文件中。这样在新增一种日志记录方案的时候,改动就小得多。
这里给出简易调用: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Logger myLogger = LoggerFactory.CreateLoggerInstance("ConsoleApplica tion1.DBLogger"); myLogger.Log(); Logger newLogger = LoggerFactory.CreateLoggerInstance("ConsoleApplica tion1.EventLogger"); newLogger.Log(); Console.Read(); } } } 形如:"ConsoleApplication1.DBLogger"的字符串,一般都建议放在配置文件中。
以上就是这个工具组件设计的构思,当然具体的记录实现都是封装的微软企业库中的Logging组件。
分享到:
相关推荐
日志的数据库记录方式,可以配置缓区大小,对于联机事务较多的应用,可配置大点,避免频繁写数据库 ----------------- 安装说明: 1. demo是postgresql的ODBC的数据源,demo的sql语句支持postgresql和MS SQL,对...
Delphi和Lazarus的日志记录组件。 版本3.3(02-05-2019)多线程,面向对象,缓冲安全。 即使您的应用程序崩溃,日志文件也将正确写入磁盘。 日志记录/解析/格式化和可选的视觉反馈工作不会占用您主线程的时间。 日志...
日志记录方法支持可变参数 日志输出格式:<时间> <线程ID> <日志级别> <日志内容> 性能: 性能是组件是否值得使用的硬指标,本组件从设计到编码的过程都尽量考虑到性能优化: ...
f) 日志记录方法支持可变参数 g) 日志输出格式:<时间> <线程ID> <日志级别> <日志内容> 3、性能: -------------------------------------------------------------------------------------- a) 支持...
肯尼伐木 通往伐木区的公路 该库提供了在MuleESB中构建和配置记录器的支持 更具体地说,它提供了比标准Logger组件更多的选项/功能。 剑斗。
首先,对于一般应用程序来说,它们并不需要太多的功能,通常只需要把日志记录到文件或反馈到应用程序,功能太多反正让用户使用起来觉得繁琐还得背负很多从来都用不到的代码。其次,这类日志组件通常是跨平台的,并不...
设备自定义、灵活组件、日志记录等为一身,全方位为用户所想的功能考虑,实现了简约 不简单的全能型上、下位机软件。其功能十分强大,兼容主流的 ModbusRTU、 ModbusASCII、ModbusTCP、 ModbusUDP、 CAN、 EtherCAT...
它鼓励通过更多可发现的日志记录字段而不是冗长且无法解析的错误消息来进行仔细的结构化日志记录。 这将产生更多有用的日志消息。 Logrus当前处于维护模式,这意味着不再引入新功能。 但是,这并不意味着它已经死了...
Elasticsearch模块包含在Elasticsearch服务器上具有数据存储功能的日志记录组件。 该模块包含以下软件包: 建造-包含用于建造零件的工厂日志-日志记录组件快速链接:利用将Python软件包安装为pip install pip-...
更好的img 一个简单的Web组件,向图像添加后备URL和日志记录功能。 该存储库包含该组件的四个不同版本: 香草Web组件用肉豆蔻制成的相同组件用Polymer制成的东西-再次使用模具查看演示。 阅读有关这些组件的更多信息...
第1章 通用权限管理组件简介 7 1.1 软件开发现状分析 7 1.2 功能定位、建设目标 7 1.3 目标用户群体 9 1.4 系统优点 11 1.5 系统架构大局观 12 1.6 物理结构图 13 1.7 逻辑结构图 14 1.8 系统运行环境配置 15 1.9 ...
此系统是一个多功能的记事本,具有日历记事本的功能,你可以写下你每天的心情记录并保存下来;又是一个类似于windows平台的记事本的一个程序,你可在其中编辑文本信息并把它保存。
如果找到,则此关联ID会附加到“关联上下文”,该上下文可用于访问当前关联ID,以便进行日志记录等。 (可选)可以将此关联ID附加到通过IHttpClientFactory创建的HttpClient实例进行的下游HTTP调用中。 注意:虽然...
综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明: 1、 Loggers Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR...
[新功能] 模块安装失败增加日志记录功能 [新功能] 博客支持超级搜索ElasticSearch(需要安装SuperSearchES) [新功能] Values组件增加Grid和Detail显示优化 [新功能] Grid过滤组件Range-Datetime增加快捷时间选取 ...
LOG相关工具类(ToolLog.java) 功能待续-->切入记录异常日志,并存储文件或上传至服务器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner...
系统设计为通用平台,可用作ERP、OA、CRM等系统的基础开发框架,具有成熟的数据访问(Dapper)、作业调度(Quartz.net)、日志记录(Log4Net)、权限控制。版本升级:V2.0 。 1、支持多数据库,可在实体类指定具体操作数据库,...
(好的日志记录方式可以提供我们足够多的定位错误的依据)。 2.主要有三个模块组成: logback-core:其它两个模块的基础模块。 logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很...
[新功能] 模块安装失败增加日志记录功能 [系统优化] config默认值为null时自动转换为字符串,避免缓存失效 [系统优化] 富文本字体显示大小 [系统优化] 移动设备导航菜单过多自动启用垂直滑动 [系统优化] Tree...
一款 Java 语言基于 SpringBoot2.x、MybatisPlus、Vue3.x、AntDesign、MySQL等框架精心打造的一款前后端分离框架,致力于实现模块化、组件化、可插拔的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台...