【问题标题】:Controller Instance created and destroyed for each request in MVC - WebAPI - What dependency scope to inject?为 MVC 中的每个请求创建和销毁控制器实例 - WebAPI - 要注入什么依赖范围?
【发布时间】:2014-08-18 10:59:23
【问题描述】:

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

据我了解,WebAPIMVCevery time a request comes, a new instance of the API-Controller is created and it is disposed after the request is served

另外,为了注入依赖,我使用castle-windsor

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

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

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

谁能告诉我在WebAPI 上下文中使用它们会有什么影响?

【问题讨论】:

标签: c# .net asp.net-web-api dependency-injection castle-windsor


【解决方案1】:

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

LifestylePerWebRequest 是控制器的默认生活方式 - 您不希望控制器比请求更有效,因为它们只是为了满足您的请求而存在。

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

如果您将其进一步放在对象解析图中,可能会发现您拥有具有作用域生命周期的 IUnitOfWork,并且您在 IMyService.DoTheJob() 期间制作并处置了其中的几个;

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

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2018-07-13
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多