【发布时间】:2009-04-08 15:35:30
【问题描述】:
我有一个单例服务,它依赖于具有请求范围生命周期的服务。
如果我允许容器在我第一次获得单例时注入请求范围的服务,那么它对于当前请求来说是可以的,但会在任何后续请求中被处理掉。
这是否意味着我必须使用依赖容器在单例中创建请求范围服务?
【问题讨论】:
我有一个单例服务,它依赖于具有请求范围生命周期的服务。
如果我允许容器在我第一次获得单例时注入请求范围的服务,那么它对于当前请求来说是可以的,但会在任何后续请求中被处理掉。
这是否意味着我必须使用依赖容器在单例中创建请求范围服务?
【问题讨论】:
我不建议在您的单例服务中注入容器本身。而是:
【讨论】:
我会问你的对象是否绝对必须是单例。如果它不是必须是单例,那么不要将其设为单例并依靠您的容器来构造它。您遇到的问题是因为依赖注入依赖于控制反转,而单例通常会自行构建。
许多容器将对它们构建的对象的生命周期负责。如果你这样做了,你也许可以指示它只使用你的对象的一个实例。但是,如果我正确阅读了您的问题,那么您确实需要每个请求的对象的新实例,因为每个请求的状态(服务)都不同。
简而言之,使用单例作为最后的手段,因为它会导致您现在遇到的问题类型。如果您被锁定在该模式中,请考虑不注入服务,而是将其作为参数传递。如果您将其引入状态,您将遇到需要不同服务实例的多个同时请求的并发问题。
【讨论】: