0

我的应用程序需要一个对象。为了实现这一点,我有两种方法

  1. 将对象定义为静态。

    public class App
    {
        public static MyClass myObject;
    }
    
  2. 使类单例

    public class MyClass
    {
        private MyClass()
        {
        }
        public static MyClass Instance
        {
            get
            {
                return Nested.instance;
            }
        }
        class Nested
        {
            static Nested()
            {
            }
            internal static readonly MyClass instance = new MyClass();
        }
     }
    

任何人都可以帮助我了解这两种方法的优缺点。

4

2 回答 2

2

我认为这两种方法都不好,您应该通过依赖注入来调查控制反转

为什么上述解决方案不好?他们使测试成为一场噩梦,“全局”对象的生命周期由其消费者决定。有关单例反模式的更多问题,请参见此处。

相反,您最好创建对象,然后其注入需要它的对象中。在这种情况下,注入只是意味着通过 setter 或构造函数参数提供它。

通过使用注入,您只配置需要这个“全局”组件的组件,并且通过使用接口,您可以替换不同的版本(例如,真实与模拟变体)。重要的是,“注入”组件的生命周期由周围的框架控制,而不是由消费实体控制。

于 2013-01-31T13:01:21.413 回答
0

我认为这两个选项之间的主要区别是何时创建它的对象。在静态成员的情况下,它将在您的App对象被创建或第一次将类用于其他静态方法/成员时创建。

在单例的情况下,可能不需要从一开始就使用它,因此在时间消耗不那么明显的时候启动它。

于 2013-01-31T13:08:20.620 回答