我在我的ASP.NET MVC项目中使用了一个母版页。这个母版页希望在每个页面上都能显示一些ViewData。
如果在我的控制器中没有设置这个ViewData键,那么就会出现找不到的错误。但是,我不想在每个控制器中都设置ViewData(我不想在每个控制器中写ViewData["foo"] = GetFoo();
)。
因此,我想在一个基础控制器中设置这个值,并让每个控制器都继承自这个基础控制器。在基础控制器的默认构造函数中,我设置了ViewData。我在这里找到了一个类似的方法:http://www.asp.net/learn/MVC/tutorial-13-cs.aspx。 到目前为止,这个方法可以正常工作...但问题是这个数据来自数据库。
现在当我想对我的控制器进行单元测试时,继承自基础控制器的控制器会调用它的默认构造函数。在默认构造函数中,我初始化了我的仓库类以从数据库中获取这个数据。结果是:我的单元测试失败了,因为它无法访问这些数据(而且我肯定不想让它们访问这些数据)。
我也不想把正确的Repository(或DataContext,无论你叫它什么)类传递给每个控制器,然后再传递给默认控制器,然后我可以使用我的单元测试模拟。控制器反过来依赖于其他仓库类,我将不得不传递多个参数给构造函数。对我来说太麻烦了,或者我错了吗?还有其他解决方法吗?
我尝试过使用StructureMap,但最终感觉那并不能解决我的问题,因为每个控制器仍然必须调用基础构造函数,这将初始化仓库类,所以我无法模拟它。
这个 是一个类似的问题,但我发现没有令人满意的答案。我能否以一种简单的方式解决它,也许使用StructureMap作为解决方案?或者我应该顶住压力,在每个控制器中传递一个Repository并再次将其传递给基础控制器?再说一遍,对于这么简单的东西来说,感觉需要做很多工作。谢谢!