ESFramework使用技巧(1) - ESFramework日志记录器的自动装配

ESFramework中很多重要的组件都配备了日志记录器IEsbLogger,用于记录框架运行时的错误和异常。这些重要组件都暴露了一个名为“EsbLogger”的属性,用于设值法注入日志记录器。

在构建应用时,我采用Spring.net进行组件装配,在Spring的XML配置文件中,需要为这些重要组件配置“EsbLogger”属性,为了不遗漏、配置不错误,手动装配时必须非常小心,甚至是我自己,也得如此。因为在数百个组件中,我也记不得哪些组件配备了IEsbLogger,哪些没有。如果能自动为需要的组件装配日志记录器就好了--这个是可以做到的。能达到这个目的是因为我们已经具备了两个前提:

(1)如果ESFramework中的一个组件需要日志记录器,它都会暴露一个名为“EsbLogger”的属性。

(2)Spring容器提供了一种间接的方法让我们遍历容器中的每一个对象。

如果能自动装配日志记录器,那么Spring配置文件中就可以不用理会任何组件的日志记录器的装配了,世界将变得简单些。

首先,我们获取Spring容器中的所有对象的list:

ArrayList objList = new ArrayList() ;
      string[] names = MainClass.SpringContext.GetObjectDefinitionNames() ;
      foreach(string name in names)
      {
        objList.Add(MainClass.SpringContext.GetObject(name)) ;
      }

接下来,写一个可重用的方法,用于为list中的每个对象设置指定的属性,如果某个对象没有指定的属性,则跳过:

public static void SetProperty(IList objs ,string propertyName ,object proValue)
    {
      object[] args = {proValue} ;
      foreach(object target in objs)
      {
        Type t = target.GetType() ;
        if(t.GetProperty(propertyName) == null)
        {
          continue ;
        }

        t.InvokeMember(propertyName ,BindingFlags.Default | BindingFlags.SetProperty ,null ,target ,args) ;
      }
    }

到了这里,已经水到渠成了:

//获取日志记录器组件
      object esbLogger = MainClass.SpringContext.GetObject("esbLogger") ;
      //装配
      SetProperty(objList ,"EsbLogger" ,esbLogger) ;

如果以后ESFramework中的某个组件需要装配日志记录器而新添了“EsbLogger”属性,那么我们的Spring配置文件也不用做任何更改了,运行时会自动装配它。

这种自动装配日志记录器的方案并不是全面适用,因为它依赖Spring容器,如果我们基于ESFramework构建的应用中没有使用类似Spring的IOC容器,那么该怎么做了?

答案,我还没找到,因为如果没有容器,我该如何获取当前应用中的所有对象了?不能得到所有的对象,就无法利用上述的反射来为之动态装配日志记录器。

之前,我还想到过一方案,就是稍微修改ESFramework中每个需要配备日志记录器的组件的实现,让它们的对象在创建的时候向公共的Util注册(可以在组件的构造函数中进行注册),这样就可以从Util获取对象列表了,但是这种方案有太强的侵入性,并且使每个组件都依赖与Util,所以放弃了这种方案。

时间: 2024-11-02 09:08:35

ESFramework使用技巧(1) - ESFramework日志记录器的自动装配的相关文章

ESFramework使用技巧(3) - 在插件中使用Spring.net

根据插件的"自治"性,插件如果需要配置信息,则插件应该自己能读取和修改配置信息,而不是框架或宿主来完成这些事情.这种松耦合特性,我们曾在ESFramework介绍之(29)―― 插件公共设施 AddinUtil 一文中特别强调过. 当一个插件非常复杂时,可能需要大量的配置信息或装配信息,使用Spring.net的IOC容器实现自动装配是一种非常方便的方法,我们的插件需要自己来操作Spring.net容器,而不是依赖于框架或宿主应用.而且,宿主应用通常也有自己的复杂的配置需要管理.在ES

基于ESFramework的P2P实现 —— ESFramework扩展之EsfP2P

    好久没有写关于ESFramework的文章了,曾很早就承诺过要写一篇介绍基于ESFramework实现NAPT P2P的文章,今天终于能抽出时间做这件事.    网络地址转换NAT(或者NAPT)的基本理论知识,网上有很多相关资料,不是很清楚的朋友可以先了解下什么是NAT.以及为什么要使用NAT.使用NAT的一个非常常见的场合就是P2P技术,要使两个隐藏在不同的局域网后面机器能够相互通信,并不是一件非常简单的事情,因为,这两台机器没有公网地址,相互之间是无法直接通过IPEndPoint访

[技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档

[技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档     Doxygen本来是一个很好的工具,可是我感觉在mac系统下,如果用doxygen最后生成的CHM文件感觉就不是那么恰当,应为本身CHM是微软的产品,苹果系统上并不是很通用,很经常出现文件乱码的情况.这时CHM就比不过PDF和RTF文件.其实直接的html文件也不错.   那在mac平台下没有什么其他的替代方法吗,肯定是有的.特地留意了一下,发现以前真是没有好好的使用xcode强大功能. HeaderDoc工具 Hea

ESFramework使用技巧(2) - 在插件中使用NHibernate

我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大块,考虑每一块使用一个功能插件来完成.在这几个插件中,有个插件需要访问某个数据库,并且只有这个插件需要访问这个数据库,根据插件的"自治"性质,你不想将本插件中的数据访问"上升蔓延"到应用程序(FS),而是让它"仅仅"在本插件中,这样,无论是对FS还是插件都是有好处的--FS自己不需要访问数据库(日志记录除外),插件"自治

信息处理,分而治之-- ESFramework 使用技巧

      ESFramework开发手册系列文章已经详细介绍了如何使用ESPlus提供的ESPlus.Application.CustomizeInfo空间来发送和处理自定义信息,而且,在我们在前面介绍的demo中,也展示了如何定义信息类型.信息协议,以及如何实现ICustomizeHandler来处理接收到的信息.在一般业务简单的系统中,我们完全可以像demo一样,在一个CustomizeHandler类中处理所有的信息,将所有的业务逻辑集中在这一个地方.但是,当业务逐渐变得复杂时,你会发现

ESFramework介绍之(22)―― 服务器系统自动升级

    (本文名字取为"服务器系统自动升级",实际上适用于所有应用程序自动升级的情况.)    前文介绍了在服务器或客户端应用程序运行的过程中,插件如何自动升级.更新.基于前文相同的理由,AS.FS.IRAS也需要有自动升级的功能.     与插件在运行时动态更新不同,服务器系统无法在运行时动态更新,只有在服务器系统重新启动的时候,才是自动升级的切入点.(1)对于功能服务器FS,可以采用持续/逐个更新的方式,即依次重启每个功能服务器.这样可以避免功能服务被中断的情况发生.需要注意的是,

基于ESFramework的FTP服务 —— ESFramework扩展之EsfFTP

      ESFramework体系的目标之一就是帮助快速构建IM与业务相结合的系统,在我们的业务应用中,经常会遇到类似这样的需求:商家或服务商需要提供一些资料(文档.影片宣传资料等)给他的用户,他希望用户能方便地下载这些资料,另外,用户也可以直接上传自己的文件到服务器供商家检阅.这种功能就像我们常用的FTP软件的功能一样,在这里,它通常可以直接集成到企业的业务应用中.    EsfFTP是一个实现了Ftp功能的ESFramework扩展,它支持如下功能:(1)下载文件(2)上传文件(3)删除

log4net教程日志分类和自动维护示例_实用技巧

如果我们需要通过配置不同的ILog,流程是这样的,首先要创建一个ILoggerRepository,通过它来进行日志等级的配置,和各种Appender,接着通过LogManager在ILoggerRepository获取一个Ilog对象,就可以写日志了.代码如下: 复制代码 代码如下: public static ILog GetLogger(string repositoryName = "")        {            if (string.IsNullOrEmpty

log4net教程日志分类和自动维护示例

 log4net能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Ilog实例,是可以做到.但由于这些功能的log配置差异性极小,也许仅仅就是文件名不同.于是想通过代码进行配置,下面把方法分享如下 如果我们需要通过配置不同的ILog,流程是这样的,首先要创建一个ILoggerRepository,通过它来进行日志等级的配置,和各种Appender,接着通过LogManager在ILoggerRepository获取一个Ilog对象,就可以写日志了.代