【发布时间】:2014-08-07 06:31:43
【问题描述】:
Mike Wasson 在 www.asp.net 上的文章“Dependency Injection for Web API Controllers”说:
依赖范围和控制器生命周期
根据请求创建控制器...
我是否正确理解 ASP.NET Web API 为每个传入请求创建一个新的控制器实例(并满足其依赖关系)?
当理论上单个实例可以用于所有请求时,这种方法是否会创建和销毁控制器的许多实例而不浪费?
【问题讨论】:
-
理论上,当然;但是.NET 中的对象创建(和销毁)并不昂贵。 ASP.NET MVC(和 WebAPI)中的控制器是相对简单的对象,当然,每个请求的旧 Web 窗体
Page的实例化可能要昂贵得多。 -
保持有状态控制器也存在实际问题:您需要额外的工作来执行单独的每个请求清理(例如数据库连接)和每个实例清理(例如控制器状态)。重入性和并发性也存在问题(ASP.NET 对每个请求使用不同的线程)。为每个请求使用一个控制器实例当然更简单、更可靠。
-
由于 HTTP 是一种无状态协议,它是一种以无状态方式处理请求的自然方式 ...
-
在某些依赖注入框架(例如 Castle)中,您可以使用池化生命周期,其中 DI 框架会自动初始化您的依赖项的 n 个资源,并将它们保存在一个池中,以便在有人请求该服务时重用(可能以循环方式)。请记住陷阱,例如该服务的销毁/最终确定通常会例如结束可以正确完成操作的事务,在 Castle 中,您可以通过实现每次回收调用的接口方法来解决此问题。
标签: asp.net-mvc