为什么我不能让我的服务单身(ioc)?

时间:2011-08-19 14:39:03

标签: .net inversion-of-control

重要提示:请注意,我不是指私人构造函数和静态实例变量(或者有人建议使用静态类)的单例,而是单例在应用程序期间从控件容器的反转中返回相同的实例寿命。

许多容器默认使用较短的使用寿命。每个依赖项(或每个请求)的新实例或每个范围的实例(例如HTTP请求)。

我想知道为什么容器会促进短寿命物品而不是长寿?

请注意,我通常只在容器中注册我的服务。如果我需要创建域模型等,我在容器中注册工厂。

2 个答案:

答案 0 :(得分:1)

做了更多的研究

因为在使用较短的生命周期时更容易处理会话特定信息。混合生命周期也会使事情变得复杂。

My best practices

答案 1 :(得分:0)

如果在很大程度上取决于您的服务是做什么的。通常,如果存在某种共享状态,您会选择单例,因此围绕该状态的同步可能会导致瓶颈,从而影响可伸缩性。如果没有共享状态,那么你仍然可以选择单例,但是你必须要小心,你不会在将来某个时候引入任何共享状态(或者如果你这样做,你就可以有效地锁定它)。

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

所以,我认为真正的答案是“它取决于”。如果你看看框架如何处理它通常是一些中间解决方案,例如维护服务池(例如数据库连接池)或Wcf的“每会话”模型。