当前位置:  开发笔记 > 编程语言 > 正文

初始化静态对象 - 代码设计问题

如何解决《初始化静态对象-代码设计问题》经验,为你挑选了2个好方法。

在我的webapplication(C#,.Net 3.5)中,由一个核心类库(包含业务逻辑,数据层和几个实用程序类),一个Windows服务项目,一个Web服务项目和网站项目组成,我有一个所有其他项目使用的核心库中的几个静态类.这些类(例如Log类)需要一些初始化(它们具有Initialize方法)才能将它们设置为使用.例如,Log类的Initialize方法有一个目录路径参数,它告诉Log,将日志文件保存到的位置.另外,我正在考虑加载日志的"设置"静态构造函数中的配置文件中的类.缺点是,我需要在生产代码中进行单元测试的不同设置.

有没有更好的方法来设计它?这种方法的缺点是,静态类的所有使用者都将尝试调用Initialize.这不是一个真正的问题,因为一旦初始化,该方法将立即返回而不是再次执行Initialize代码,但设计对我来说似乎有点奇怪.

我希望我的英语足以解释我所追求的目标.不要犹豫,问问题是否不够明确.



1> Jon Skeet..:

我会尽量避免需要初始化的东西的静态类.使您的Log类成为普通类,并且可能有一个单独的工厂类来创建实例或单个实例.你可能想要使用依赖注入来避免任何静态,尽管这可能会让像日志这样的事情变得非常痛苦.

特别是对于日志记录,log4net和log4j(您自己编译的任何原因,顺便说一句?)使用的方法是根据名称(通常基于使用它的类型的名称)向一些工厂类询问日志实例.这通常存储在需要执行日志记录的每个类中的静态变量中.如果返回的日志记录对象之后仍然可能受到日志记录子系统初始化的影响,那么在日志记录客户端初始化之前,DI容器必须初始化日志记录框架时,不会遇到排序问题.

使用单独的日志记录对象而不是静态类可以提高可测试性 - 您可以在测试期间将记录对象替换为记录日志的记录对象,以确保捕获(比方说)审计信息.静态知道日志记录对象的一个​​缺点是这减少了并行运行测试的可能性.

对于有些随意的沉思道歉 - 我还没吃过第一杯咖啡.希望它有用但是有用.



2> tsimon..:

如果初始化很昂贵,我会建议使用Singleton(如果你不熟悉设计模式,谷歌Singleton设计模式).作为实例构造的一部分,然后读入配置文件,该文件可以特定于环境.

这样你就可以获得两全其美.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有