使用IoC,可以向Singleton注入具有瞬态寿命的对象吗?

时间:2012-12-27 18:26:44

标签: asp.net-mvc dependency-injection ioc-container

我们有一个ASP.NET MVC应用程序,使用IoC将服务引用注入控制器,并将存储库引用注入服务。

控制器必须具有瞬态寿命,因为它们必须根据请求进行实例化。但是,如果整个IoC堆栈按请求进行新增,则会产生一些开销。我们有更多的依赖关系而不是我喜欢,一个选项是拥有更多的控制器,每个控制器在堆栈中具有更少的依赖关系。但是,暂时把它放在一边,我的问题是,如果作为单例注入的对象具有具有瞬态生命周期的依赖关系,那么这些依赖关系是否会因为被Singleton拥有而被视为单身?

具体来说,如果我们有以下

RepositoryA(需要是瞬态的,因为当前设计在构造函数中注入用户上下文) ServiceA(单身人士) ControllerA(瞬态)

实例化如下:

public ServiceA(IRepositoryA repo) {}
public ControllerA(IServiceA service) {}

RepositoryA是否会实例化一次,因为ServiceA实例化了一次?

我99%肯定答案是肯定的,但只是想确认我必须在这里做的重构数量。

另外,假设服务和存储库没有任何用户/请求特定的实例变量,作为一种设计方法,是否有任何理由不对它们使用Singleton生存期?

1 个答案:

答案 0 :(得分:4)

  

如果作为单例注入的对象具有依赖性   有一个短暂的生命周期,这些依赖性基本上是   因为被辛格尔顿所拥有而被视为单身人士?

这是对的。由于此类组件保留其依赖项(通过将其引用存储在私有字段中),因此只要组件本身存在,这些依赖项就会存在。换句话说,它们的生命周期被隐含地提升到组件的生命周期(如果它们的生命周期更短)。

如果你有这个,你的DI配置肯定是错误的,迟早会出现这个错误。可能只在生产中,而且几乎没有在您的开发机器上:-S。

通常,容器管理的所有组件应仅依赖于寿命等于或长于组件本身的抽象。

有些框架甚至提供了分析服务来检测这些类型的配置错误。尽管如此,在连接所有依赖项时应该非常小心。通常,尽可能将组件配置为瞬态是最安全的,因为允许瞬态组件包含任何生活方式的依赖性。拥有许多瞬态对象通常不会成为性能问题。为每个Web请求构建一个相当大的对象图通常会足够快(否则请尝试切换到DI framework with a higher throughput)。