Angular的所有服务都是单身人士。众所周知,单身人士是不好的做法。
我知道许多人(包括我)对Angular非常满意。 我在这里缺少什么?
答案 0 :(得分:2)
Singleton仍然是一个超级有用的模式,在这个帖子中指出了缺点:
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容器可以轻松使用单例,而不会产生潜在的不良影响。