【问题标题】:NHibernate, Sqlite, missing tables and IOC funNHibernate、Sqlite、缺失表和 IOC 乐趣
【发布时间】:2012-10-18 01:54:55
【问题描述】:

我正在对使用 NHibernate 进行持久性的类库进行单元测试。 NHibernate 使用 Sqlite 内存数据库进行测试。一般情况下,让StructureMap帮我踢出一个会话是很容易的。

但是,因为我使用内存数据库来提高测试速度,所以我需要在测试期间有一个可用的会话(因为当我创建一个新的数据库时它会破坏数据库)。还有另一个皱纹。目前困扰我的案例是测试一个自定义的基于 NHibernate 的 ASP.NET 成员资格提供程序。这些显然是每个 AppDomain 创建一次,因此出于显而易见的原因,我不应该将会话注入其中。

在结构映射中是否有一种方法可以告诉它摆脱特定类型的实例,同时仍然保留告诉它如何实例化该类型的位?真的,如果我能摆脱它,我只会让它像 HttpScoped 对象生命周期一样,但显然我只能在 Http 请求的上下文中这样做。有没有一种直接的方法来手动控制从结构映射中出来的对象的生命周期?

对于这个问题的长度以及这是一个愚蠢的问题的可能性,我深表歉意。我是一个人在这个项目上,所以我真的没有任何人可以提出想法。

【问题讨论】:

    标签: sqlite nhibernate structuremap


    【解决方案1】:

    您可以将会话包装在您自己的 ISession 实现中,该实现委托给您控制的真实会话。然后注册自己的 ISession 作为实例。

    【讨论】:

    • 我将把你的标记为修复,因为正是这个想法让我想到了我需要的想法,我将在下面解释。
    【解决方案2】:

    我最终为我的提供者创建了两个构造函数以及一个 Func 类型的私有变量。默认情况下,它的值设置为我使用 StructureMap 的 ObjectFactory 创建会话的标准代码。

    作为参数接受的重载构造函数是 Func 类型的对象。这样,如果需要,我可以注入一种策略来创建该类型的实例,否则不必进行任何扩展工作。在我的测试中,我在 NUnit 设置方法中创建了会话,并在 Teardown 中将其销毁。我不喜欢这个想法,但我目前还没有足够讨厌它来撕掉它......但是。

    这消除了我在表格方面遇到的错误。但是,在我创建的条件下,由于某种原因,NHibernate 似乎无法写入内存中的 sqlite 数据库。我现在正在测试是否可以写入文件系统中的一个。这并不理想,但在写入磁盘的性能真正开始受到伤害之前,还需要很长时间(我希望)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2018-08-14
      • 2016-11-05
      • 2010-12-24
      相关资源
      最近更新 更多