我们正在建立一个ASP.NET MVC的网站,我与这里定义的连接最好使单元测试挣扎(我使用“连接”一般 - 它可能是一个会话,连接,适配器,或任何其他类型的数据上下文可以管理事务和数据库操作)。在MVC中实例化Data Context(适配器,连接,会话等)的位置?
比方说,我们有3类:
UserController
UserService
UserRepository
在过去,我们会做UserService的方法中是这样的:
Using (ISomeSession session = new SomeSession())
{
session.StartTransaction();
IUserRepository rep = new UserRepository(session);
rep.DoSomething();
rep.Save();
session.Commit();
}
然而,这是不是真的因为SomeSession的依赖没有被注入,所以可以对它进行单元测试。但是,如果我们使用D.I.要在UserService中注入依赖关系,会话在UserService的整个生命周期中都会挂起。如果从UserController调用了多个服务,则每个会话都可以挂起,直到UserController被垃圾收集为止。
有关如何更好地管理此问题的任何想法?我错过了明显的东西吗?
编辑
对不起,如果我不清楚 - 我知道我可以使用依赖注入与Session /数据上下文,但后来它被保存在服务类的生活。对于任何运行时间较长的操作/方法(即假设服务正在被批处理进程调用),除了增加可测试性之外,这可能会导致大量的开放会话。
如果您使用真正的连接进行测试,那么您不是单元测试,而是集成测试。 – RichardOD 2009-08-10 10:04:34
理查德 - 我明白这一点。我的观点是,我不知道如何在整个课程生命周期中保持连接不活动(或至少上下文活动),而不是在Using语句中的一小段时间内将依赖关系移动到课程级别。 “使用”块似乎更安全,因为它在需要时打开连接,并在完成时关闭连接。 – 2009-08-10 18:37:53