嘲笑NHibernate&;林克

本文关键字:林克 amp NHibernate 嘲笑 | 更新日期: 2023-09-27 18:26:46

我正在使用NHibernate,并在前端公开了会话。我有一个控制器操作,它检索任务如下:

public ActionResult Overview(DateTime date)
{
    var allTasks = GetTasksUpUntilDate(date);
    return PartialView("Tasks/Overview", allTasks);
}
private List<TaskOverviewModel> GetTasksUpUntilDate(DateTime date)
{            
    var allTasks = _session.Query<Task>().Where(t.BookedBy.UserName.Equals(CurrentUser.Name,
                                       StringComparison.CurrentCultureIgnoreCase));            
    var tasks = allTasks.Where(t => t.DueDate <= date);
    var taskVMs = new List<TaskOverviewModel>();        
    tasks.ForEach(t => taskVMs.Add(MapEntityToViewModel(t)));
    return taskVMs;
}

现在我不想仅仅为我的视图创建一个IRepository,因为ISession实际上已经是一个存储库了。然而,事实证明,嘲笑/反驳这一点相当困难。那么,有人能帮我让_session.Query返回我在测试时提供的对象列表吗?。

我还想避免建立内存中的数据库,并且在测试中使用RhinoMocks。

嘲笑NHibernate&;林克

不要伪造Nh/linq。相反,设置一个内存中的sqlitedb进行查询。它们非常快速且易于使用。

NHibernate Session可能适合存储库模式,但如果您正在构建控制器以直接与它对话,那么您并不是真正对它进行抽象。当您没有对其进行抽象时嘲笑它不是一个可靠的解决方案。

如果你绝对不想抽象它(这纯粹是懒惰,IMO),那么Jason提到的sqllite-db是一个很好的调用。然而,在一个大型项目中,适当地分离您的关注点是一个非常好的主意。

我的域模型包含数据访问对象(repo)和使用它们的服务的接口。这使我能够真正将我的数据问题与业务问题分开,应该与视图/应用程序问题完全分开。这允许进行适当的单元测试,并能够轻松地交换部件或进行适当的模拟。

每一层只与接口对话,从不与实现对话。此外,我的应用程序层从不直接与仅数据层的服务进行对话。允许这种情况发生似乎会鼓励开发人员懒惰,开始将业务或数据逻辑放入应用程序中。