每个请求的依赖注入容器

时间:2009-08-20 01:27:34

标签: c# .net 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
}

这只是模拟单例模式。


我的问题:

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

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

    感谢。

1 个答案:

答案 0 :(得分:4)

如果适合你,那就没问题了:)

由于Web应用程序的无状态特性,执行此操作不应该给您任何功能问题,因为您只需要为每个请求设置一个容器,并且多个实例将彼此独立地生活。

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

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

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