【问题标题】:Dependency injection Container per request每个请求的依赖注入容器
【发布时间】:2009-08-20 01:27:33
【问题描述】:

为 ASP.NET 应用程序创建依赖注入容器是很常见的,这样它就在应用程序存在时存在。

我在每个请求中创建 DI 容器,并在请求结束时释放它。
主要目的是当容器被释放时,任何 DI 容器都支持 Disposing 对象。


附加:如果我需要在请求之间共享资源(NHibernate SessionFactory),我只需将它们保存在静态变量中,并将该值封装在每个请求的对象中。像这样:

public class SessionFactoryAggregator : ISessionFactory {
    static ISessionFactory actualFactory;

    // Implement ISessionFactory and proxy calls to the actualFactory
}

这只是模拟的单例模式。


我的问题:

  1. 可以这样做吗?
  2. 如果不是,为什么以及应该怎么做?
  3. 此方法中是否存在任何已知的性能问题?

更新:目前我通过自己对 DI 提供者的抽象来使用 Castle Windsor,因此实际的容器是可插拔的。

谢谢。

【问题讨论】:

    标签: c# .net asp.net design-patterns dependency-injection


    【解决方案1】:

    如果它适合你,那就没关系:)

    由于 Web 应用程序的无状态特性,这样做不会给您带来任何功能问题,因为您只需为每个请求提供一个容器,并且多个实例将彼此独立地存在。

    然而,从可扩展性的角度来看,这可能不是最有效的方法(但请记住,您应该衡量性能而不是猜测),因为应用程序会大量连接和拆除也可以共享的资源。

    大多数 DI 容器都具有管理对象生命周期的能力,而且它们中的大多数甚至是 Web 感知的,这意味着您应该能够告诉它某些组件具有“按请求”的生命周期,并且它们应该是在每次请求后处理。

    这将允许您将其他组件保持为单例(生命周期模式,而不是创建模式),以便可以在多个请求之间共享它们。这对于通常是线程安全的数据访问组件来说通常是一个好主意,因为它们不包含可变状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2013-04-30
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多