C# 每个请求的依赖项注入容器

C# 每个请求的依赖项注入容器,c#,.net,asp.net,design-patterns,dependency-injection,C#,.net,Asp.net,Design Patterns,Dependency Injection,为ASP.NET应用程序创建依赖项注入容器是非常常见的,这样它就可以在应用程序运行时运行 我在每个请求中创建DI容器,并在请求结束时释放它。 主要目的是任何DI容器都支持在容器被释放时释放对象 附加:如果我需要在请求之间共享资源(NHibernate SessionFactory),我只需将它们保存在一个静态变量中,并将该值封装在每个请求的一个对象中。像这样: public class SessionFactoryAggregator : ISessionFactory { stati

为ASP.NET应用程序创建依赖项注入容器是非常常见的,这样它就可以在应用程序运行时运行

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


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

public class SessionFactoryAggregator : ISessionFactory {
    static ISessionFactory actualFactory;

    // Implement ISessionFactory and proxy calls to the actualFactory
}
这只是模拟的单例模式


我的问题是:

  • 这样可以吗
  • 如果不是,为什么以及应该做什么
  • 此方法中有任何已知的性能问题吗

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


    谢谢。

    如果它对您有效,那么就可以:)

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

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

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

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