代码之家  ›  专栏  ›  技术社区  ›  BFree

与Linq-to-Sql数据上下文的统一。RegisterType或RegisterInstance

  •  0
  • BFree  · 技术社区  · 16 年前

    这是基本的设置。在ASP.Net网站上,有几个页面显示来自数据库的数据的报告。所有的数据都是通过存储过程来获得的,这些存储过程是使用Linq to Sql访问的。这些页面在不同的时间可能会有很高的流量。我们使用的是带有MVP模式的ASP.Net和用于IoC的Unity(尽管这个问题无论容器如何都是相同的)。每个演示者都会被注入一个IDataRepository,这个IDataAccess会在引擎盖下发布一个Linq-to-Sql数据上下文。

    问题是,在连接容器时,我们是应该对IDataAccess使用RegisterInstance(singleton),还是应该使用RegisterType。我想问题的关键在于:Unity如何处理Dispose()(当使用RegisterType时,它是否会正确地处理我处理DataContext的DataAccess类)以及新建DataContext的成本有多高。另一方面,有(潜在的)多个线程访问同一个DataContext会减少多少?

    最后一点要注意的是,不确定这是否相关,在这种情况下,DataContext被严格用于读取数据,它从不执行任何写操作。

    2 回复  |  直到 16 年前
        1
  •  3
  •   jason    16 年前

    一般来说, DataContext s不是线程安全的。但它们的设计成本低,易于安装和拆卸,而且重量轻。你应该把它们看作工作的一部分。因此,您应该为每个与数据库的“对话”使用一个(只有您可以决定什么是“对话”)。

    因此,我强烈建议您不要设置

    此外,如果只用于读取,则应设置 ObjectTrackingEnabled 被禁用(类似于 IStatelessSession 在尼伯纳特)。

        2
  •  2
  •   TalentTuner    16 年前

    Singleton模式和Singleton作用域是有区别的,包括UNITY在内的大多数DI框架都使用Singleton作用域。

    单例作用域:每个注入器只存在一个实例,这是一个非常重要的概念,因为在一个应用程序中可能有多个注入器共存,因此多个单例,在这种情况下,每个注入器将持有单例作用域对象的不同实例应用程序的生命周期,但在DI中不是这样的。

    有一本很好的关于依赖性注射的书,作者是Dhanji R.Prasanna。

    推荐文章