3

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

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

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

我为这个问题的长度以及这是一个愚蠢的问题的可能性道歉。我在这个项目上是一个人,所以我真的没有人可以提出想法。

4

2 回答 2

1

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

于 2012-10-18T09:42:06.363 回答
0

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

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

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

于 2012-10-18T22:38:03.417 回答