gpt4 book ai didi

c# - 为 MVC 中的每个请求创建和销毁的 Controller 实例 - WebAPI - 要注入(inject)的依赖范围是什么?

转载 作者:行者123 更新时间:2023-11-30 16:58:22 25 4
gpt4 key购买 nike

我正在开发一个 WebAPI 应用程序。

据我了解 WebAPIMVC每次收到请求时,都会创建一个新的 API-Controller 实例,并在请求已送达

此外,为了注入(inject)依赖项,我使用 caSTLe-windsor

     aContainer.Register(Component
.For<IDataProvider>()
.ImplementedBy<DataProvider>()
.LifestyleScoped());

aContainer.Register(Component
.For<IDataProvider>()
.ImplementedBy<DataProvider>()
.LifestylePerWebRequest());

这里的问题是我对使用 LifeStyleScopedLifeStylePerRequest 感到很困惑。文档非常庞大,我迷路了。

谁能告诉我在 WebAPI 上下文中使用它们各自的影响是什么?

最佳答案

如果您尝试在 Web 堆栈之外思考,您会发现 LifeStyleScoped 一点也不令人困惑。它只是标记对象生命周期的开始和结束。我已经看到具有范围生命周期的 UnitOfWork 模式的实现,它提供了一种功能,如带回滚的嵌套事务 - 嵌套工作单元 - 或在同一请求/操作期间的多个。

LifestylePerWebRequest 是 Controllers 的默认生活方式 - 你不希望你的 Controllers 活得比请求长,因为它们只是为了满足你的请求,仅此而已。

您可以将任何您想要的东西注入(inject) Controller 。当然你必须小心释放你的组件。例如-您制作 IMyService 的单例生活方式实现并将其注入(inject) Controller (如果您将注入(inject)的服务作为私有(private)成员,那么它们也将是线程安全的,因为它们的方法堆栈框架对于每个方法调用都是不同的)。这样,您将为每个请求拥有相同的 IMyService 实例。在应用程序生命周期或其他“应用程序结束”事件结束时,您必须释放所有内容。特别是 SQL 连接。

如果您进一步沿着对象解析图向下看,可能会发现您有 IUnitOfWork,它具有范围内的生命周期,并且您在 IMyService.DoTheJob() 期间创建和处理其中的几个;

作为结论 - 您可以将任何您想要的东西注入(inject)到您的 Controller 中,但请记住释放一些比 PerWebRequest 具有“更大生命周期范围”的对象,并且在特定请求之后不需要。

关于c# - 为 MVC 中的每个请求创建和销毁的 Controller 实例 - WebAPI - 要注入(inject)的依赖范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25361711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com