瞬态与每个webrequest生活方式,什么构成网络请求?

Whi*_*uit 5 castle-windsor ninject autofac

这两个生命周期有什么不同?

假设我的MVC控制器被提供了一个配置为瞬态的对象,然后当有人访问该控制器中的方法时,在类构造函数中注入一个新实例,然后调用该方法.

每次获取/发送到控制器都是一个新请求,对吧?如果是这样,那么我认为两者之间没有任何区别.

有人可以解释/提供一个何时使用一个与另一个的例子?

Ste*_*ven 6

将类型注册为Transient时,TransientWeb Request之间的区别可以忽略不计,因为 - Controller如您所说- 每个请求都有自己的,并且在该请求中只解析了该类型的一个控制器实例.Controller

Controller多个组件引用的对象图中存在依赖关系时,事情开始变得有趣.可能发生这种情况的一个很好的例子是工作单元(例如实体框架DbContext).对象图中的多个服务可能需要相同的工作单元,并且为了应用程序的正确性,它们在该请求期间都需要相同的实例; 但每个请求必须获得一个新的工作单元实例.

要了解更多关于何时何时没有每个请求的工作单元,阅读: 每个Web请求一个DbContext ...为什么?


sam*_*amy 4

您不能因为无法区分它不知道的情况而责备 DI 工具。PerWebRequest 范围是从 Web 调用开始到 Web 调用结束的范围。只要您持有对已解析实体的引用(通常是调用者的生命周期),瞬态生命周期就存在。

当然,如果解析实体与请求具有相同的生命周期,您将不会看到任何差异。PerWebRequest 的生命周期从请求开始到结束。瞬态寿命根据其所持有的参考而存在;如果您需要一些完全依赖于当前网络请求的日志记录,您可以设置 PerWebRequest 生命周期。处理请求的控制器将获得一个瞬态生命周期,因为它的工作完成了,不再需要它了