代码之家  ›  专栏  ›  技术社区  ›  Tomas Pajonk

如何访问应用程序级对象(即记录器、容器、工作单元)?

  •  1
  • Tomas Pajonk  · 技术社区  · 16 年前

    设置和保持这些“全局”对象的最佳实践是什么?

    我曾经遇到过这个问题

    • ORM会话对象(来自devexpress的xpo)

    • IOC容器(microsoft.unity)

    • 记录器(来自对象人)

    我想出了三个解决办法:

    1. 依赖注入 . 对我来说,这看起来非常麻烦,我觉得每个类都有额外的三个getter/setter,这几乎是所有类都会用到的。另一方面,它消除了全局变量的恐惧,使代码位之间的依赖性降低。

    2. 创建静态类 (例如containerkeeper)可以设置一次并返回被保留的对象。我知道这类似于单例,我应该用单例代替。

    3. 使用单件模式 . 我读过一些关于使用单例的讨论,以及单例有多糟糕等等,所以我坦率地不确定在这些情况下使用单例会破坏多少优秀OO设计的原则。

    所以我的问题是:

    还有别的选择吗,我完全偏离轨道了吗?你会怎么做?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Mendelt    16 年前

    我通常使用依赖注入,这是选项1。但我通常使用属性来代替使用构造函数参数进行注入。这将清理我的构造函数。我用温莎城堡作为国际奥委会的集装箱。它允许我将安装代码从构造函数移动到一个初始化方法,每当我实现一个IInitializable接口时,在设置所有依赖项之后调用该方法。但我的猜测是,团结也支持类似的事情。

    选项2和3不是最佳的。通过调用statics,您可以将代码与它所依赖的类的实现联系起来。注入它们只会将代码与依赖项的接口联系起来。


    您确实需要容器对象。但通常只在最高级别。依赖关系等的依赖关系是自动解决的,Castle Windsor这样做了,我很肯定Unity也这样做了。我通常不将IOC容器用于需要在飞行中构建的对象,因此我不需要经常参考较低级别的容器。当我确实需要这样做时,有一些技巧可以让容器将自己注入到依赖它的类中。我要写一篇关于这个的博文。完成后我会通知你的。

        2
  •  2
  •   RS Conley    16 年前

    我将把它们放在您自己设计的接口后面,并调用全局实例。这样,您就不必依赖于那个特定的实现。您可以清楚地定义这些服务正在使用的内容。最后,避免把这些类弄乱。

    就像任何事情一样,这是一个判断的召唤。确保你所做的全球化服务是真正的全球化服务。例如,记录器绝对是一个很好的候选者。

    推荐文章