为什么我不应该将我的服务设置为单例(IOC)?

11 浏览
0 Comments

为什么我不应该将我的服务设置为单例(IOC)?

重要提示:请注意,我并不是指具有私有构造函数和静态实例变量的单例(或者像某人建议的静态类),而是指在应用程序生命周期内从控制反转容器返回相同实例的单例。\n许多容器默认使用短生命周期。可以是每个依赖项(或每个请求)的新实例,也可以是每个范围(例如HTTP请求)的实例。\n我想知道为什么容器推崇短生命周期的对象而不是长生命周期的对象?\n请注意,我通常只在容器中注册我的服务。如果需要创建域模型等,我会在容器中注册工厂。

0
0 Comments

为什么我不应该将我的服务设计为单例(IOC)?

在很大程度上取决于你的服务在做什么。通常情况下,如果存在某些共享状态,你可以选择使用单例模式,但是在这种情况下,对该状态的同步可能会导致性能瓶颈,从而影响可扩展性。如果没有共享状态,你仍然可以选择使用单例模式,但是必须小心,以免在将来引入任何共享状态(或者在引入共享状态时对其进行有效的锁定)。

如果每次都返回一个新的服务实例,那么你就不必担心这个问题,并且这可能会在未来带来更好的可扩展性/灵活性,尽管返回一个新实例也可能会影响可扩展性,如果该实例持有稀缺资源(例如数据库连接)。

因此,我认为真正的答案是“这要视情况而定”。如果你看一下框架是如何处理这个问题的,通常会采用一些中间方案,例如维护一组服务的池(例如数据库连接池)或Wcf的“每个会话”模型。

0
0 Comments

为什么不应该将服务设计为单例模式(控制反转)?

在进行更多的研究后,我发现不应该将服务设计为单例模式的原因。一方面,使用较短的生命周期可以更容易处理与会话特定信息相关的问题。混合不同的生命周期可能会使事情变得更加复杂。

当我们在单例服务中使用作用域依赖项时,一开始一切都会正常工作。然而,作用域服务通常不设计为长时间运行。如果它们使用外部资源,比如套接字连接或数据库连接,那么在某个时刻可能会丢失连接。由于作用域服务并不设计为长时间运行,它很可能会开始出现故障,从而导致单例服务也开始出现故障,并且这种情况将持续到应用程序重新启动。

另外,我的WordPress安装遭到了黑客攻击,所以我已经删除了相关链接。

解决这个问题的方法是将服务设计为短时间生命周期,例如使用作用域生命周期,而不是单例模式。这样可以避免混合不同生命周期造成的复杂性,并且可以更好地处理与会话特定信息相关的问题。

0