syd*_*yos 6 asp.net-mvc dependency-injection ioc-container
我们有一个ASP.NET MVC应用程序,使用IoC将服务引用注入控制器,将存储库引用注入服务.
控制器必须具有瞬态寿命,因为它们必须根据请求进行实例化.但是,如果整个IoC堆栈按请求进行新增,则会产生一些开销.我们有比我想要的更多的依赖项,一个选项是拥有更多的控制器,每个控制器在堆栈中具有更少的依赖性.但是,暂时把它放在一边,我的问题是,如果一个注入单身的对象具有一个具有瞬态生命周期的依赖关系,那么这些依赖关系是否会因为被Singleton拥有而被视为单身?
具体来说,如果我们有以下内容
RepositoryA(需要是瞬态的,因为当前设计在构造函数中注入用户上下文)ServiceA(单例)ControllerA(瞬态)
实例化如下:
public ServiceA(IRepositoryA repo) {}
public ControllerA(IServiceA service) {}
Run Code Online (Sandbox Code Playgroud)
RepositoryA实际上是否会被实例化一次因为ServiceA被实例化一次?
我99%肯定答案是肯定的,但只想确认我必须在这里做的重构数量.
另外,假设服务和存储库没有任何用户/请求特定的实例变量,作为一种设计方法,是否有任何理由不对它们使用Singleton生命周期?
如果作为单例注入的对象具有具有短暂生命周期的依赖项,那么这些依赖项是否会因为由单例拥有而本质上被视为单例?
没错。由于此类组件保留其依赖项(通过将它们的引用存储在私有字段中),因此这些依赖项将与组件本身存在的时间一样长。换句话说,它们的生命周期被隐式提升为组件的生命周期(如果它们的生命周期更短)。
如果你有这个,你的 DI 配置肯定是错误的,迟早会出现这个错误。可能只在生产中,几乎从来没有在你的开发机器上:-S。
一般来说,容器管理的所有组件应该只依赖于生命周期等于或长于组件本身的抽象。
一些框架甚至有分析服务来检测这些类型的配置错误。尽管如此,在连接所有依赖项时应该非常小心。一般来说,尽可能将组件配置为瞬态是最安全的,因为瞬态组件可以包含任何生活方式的依赖项。拥有许多瞬态对象通常不会成为性能问题。为每个 Web 请求构建一个相当大的对象图通常足够快(否则尝试切换到具有更高吞吐量的DI 框架)。
归档时间: |
|
查看次数: |
1565 次 |
最近记录: |