• 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,所以放弃了这种方案。

    转到  :ESFramework 可复用的通信框架(序) 


  • 相关阅读:
    关于App_Offline.htm的应用实例(及CIM_DataFile的用法)注意Windows下
    Office2007多个文档打开时,开启多个窗口(独立进程)
    Asp.Net环境下web Pages,web Forms 及MVC的优越及缺点
    批量生成表Create SQL 示例 Generate SQL Create Scripts for existing tables with Query
    Different between datetime and timestamp, and its setting
    SqlConnection ,SqlTransaction,SqlCommand的常用法
    ASP.NET下从Server端下载文件到Client端C#
    C#中Remote文件复制简例子
    DOS BAT用法简例子
    改善SQL Procedure性能的几点方法
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/387568.html
Copyright © 2020-2023  润新知