我正在对使用NHibernate进行持久化的类库进行单元测试。 NHibernate正在使用Sqlite内存数据库进行测试。在正常情况下,很容易让StructureMap为我开会。
但是,因为我正在使用内存数据库来提高测试速度,所以我需要在测试期间有一个可用的会话(因为当我创建一个新数据库时它会将数据库吹走)。还有另一个皱纹。目前正在烧我的案例是测试一个基于NHibernate的自定义ASP.NET成员资格提供程序。这些是每个AppDomain显然创建的,因此我不应该将会话注入其中,原因显而易见。
结构图中是否有一种方法可以告诉它摆脱特定类型的实例,同时仍然保持告诉它如何实例化该类型的位?真的,如果我能逃脱它,我会让它像HttpScoped对象的生命周期一样,但显然我只能在Http请求的上下文中这样做。有没有一种直接的方法来手动控制来自结构图的对象的生命周期?
我为这个问题的长度以及它是一个愚蠢的问题的可能性道歉。我是这个项目的独奏,所以我真的没有任何人可以反复思考。
答案 0 :(得分:1)
您可以将会话包装在您自己的ISession实现中,该实现委派给您控制的生命周期。然后将您自己的ISession注册为实例。
答案 1 :(得分:0)
我最终为我的提供者创建了两个构造函数以及一个类型为Func的私有变量。默认情况下,其值设置为我使用StructureMap的ObjectFactory创建会话的标准代码。
重载的构造函数接受作为Func类型的对象的参数。这样,我可以根据需要注入创建该类型实例的策略,但不需要经过任何扩展工作。在我测试的情况下,我在NUnit设置方法中创建了会话并在Teardown中将其销毁。我不喜欢这个想法,但我现在还不讨厌将它撕掉....但是。
这摆脱了我在表格方面遇到的错误。但是,由于某些原因NHibernate似乎无法在我创建的条件下写入内存中的sqlite数据库。我现在正在进行测试,看看我是否可以写入文件系统中的一个。它并不理想,但在写入磁盘的性能真正开始受到伤害之前,它将是一段很长的时间(我希望)。