依赖注入:每个请求一个容器

4
很常见为ASP.NET应用程序创建依赖注入容器,以使其与应用程序同时存在。
我会在每个请求中创建DI容器,并在请求结束时释放它。主要目的是当容器被处理时,任何DI容器都支持处理对象。
附加:如果需要在请求之间共享资源(如NHibernate SessionFactory),只需将它们保存在静态变量中,并将该值封装在每个请求的对象中。
public class SessionFactoryAggregator : ISessionFactory {
    static ISessionFactory actualFactory;

    // Implement ISessionFactory and proxy calls to the actualFactory
}

这只是模拟单例模式。


我的问题:

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

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

谢谢。

1个回答

5

如果这个方法对你有效,那么就可以使用 :)

由于Web应用程序的无状态特性,这样做不会给你带来任何功能问题,因为你只是为每个请求创建一个容器,而多个实例将独立地存在。

然而,从可扩展性的角度来看,这可能不是最有效的方法(但要记住,你应该通过性能测试而不是猜测来衡量它),因为应用程序将会连接和拆除许多资源,这些资源本来可以共享。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接