2015-07-20 56 views
0

Angular中的所有服务都是单例。单身已知是不好的习惯。单身人士知道是不好的做法,角度是基于单身人士。角度不好?

我知道很多人(包括我)对Angular非常满意。 我在这里错过了什么?

+1

这听起来更像是逻辑谬误,而不是一个真正的问题。 – estus

+0

这是一个基于意见的相当大胆的陈述。我不认为每个开发人员都会同意Singletons不好。如果使用得当,它们可能非常有用(我的观点)。 – EJK

+0

你的比较是错误的!单身人士只能解决角度服务在资源争用中起作用的一个问题。 – hyphenbash

回答

2

辛格尔顿仍然是一个超级有用的模式,与弊端在这个线程指出:

What is so bad about singletons?

它们通常用作全局实例,这是为什么这么差? 因为您将应用程序的依赖关系隐藏在您的 代码中,而不是通过接口公开它们。全球范围内制作东西以避免传递它是一种代码味道。

他们违反单一责任原则:凭借其控制自己的创作和生命周期的事实。

它们固有地导致代码紧密耦合。这使得在很多情况下伪装 他们很难。

它们在应用程序的整个生命周期中都带有状态。另一个 碰到测试,因为你可以结束的情况下,测试需要订​​购 这是一个很大的单元测试不是没有。为什么?因为每个 单元测试应该是相互独立的。

大部分的批评似乎在非常老式执行单例模式,在那里它们被全局创建的必须指出:

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 
    protected ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 
    public static ClassicSingleton getInstance() { 
     if(instance == null) { 
     instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

使用依赖注入容器(如角或春天)克服了上述大多数反对意见。容器处理生命周期并将单例实例注入客户代码。为了测试目的,您可以随时使用不同的单身人员替换注入的单身人士。

简而言之,使用DI容器可以很容易地使用单身人士,而不会产生潜在的不良影响。