每个请求的依赖注入容器

Dmy*_*iak 4 .net c# asp.net design-patterns dependency-injection

为 ASP.NET 应用程序创建依赖注入容器是很常见的,这样它就可以与应用程序一起生存。

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


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

public class SessionFactoryAggregator : ISessionFactory {
    static ISessionFactory actualFactory;

    // Implement ISessionFactory and proxy calls to the actualFactory
}
Run Code Online (Sandbox Code Playgroud)

这只是模拟的单例模式。


我的问题:

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

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

谢谢。

Mar*_*ann 5

如果它对你有用,那就没问题了:)

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

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

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

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