如何在控制器中解耦依赖项?

时间:2012-02-03 19:16:51

标签: c# asp.net-mvc-3

我希望能够编写测试代码。但我的Action与我的DataContext相关联。如何删除依赖?

    public ViewResult About()
    {
        var db = new CamaDataContext();

        var item = new PropertyViewModel();


        AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item);

        return View(item);
    }

5 个答案:

答案 0 :(得分:2)

  1. 为不同的实体创建存储库接口。

  2. 为不同的实体创建具体的存储库。

  3. 将这些存储库存储在控制器级别。

  4. 使用Controller的构造函数允许存储库被注入(如果没有提供,则使用Concrete实现)。

  5. 这将允许您在单元测试期间模拟存储库,以便两者不紧密耦合。

答案 1 :(得分:1)

使用依赖注入框架(如ninject或structuremap)通过控制器的构造函数传递它,然后在编写测试时,可以在思想构造函数中传递这些依赖项。

这也可以让你有机会模拟这些依赖项,而不是在测试时实际上不必调用数据库

答案 2 :(得分:1)

您可以轻松地重构上述代码以进行测试(假设您有一些业务逻辑需要测试)。任何逻辑都会移出到您在X实体中传递给的类。然后,您只需通过填充类并将其发送来测试您的逻辑。

作为替代方案,保持控制器动作非常轻便,因此可能不需要测试。

另外,在单独的说明中,处理您的上下文类:

 使用(var db = new CamaDataContext()) { .. 返回视图(..) }

还要考虑此处所示的[AutoMap()]属性,以使您的操作方法更加精简。

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

我想在控制器中使用双线方法,因为这样不需要测试。

答案 3 :(得分:1)

微软有一个很棒的教程。这不是完全直截了当的,但对课程的好学习以及尝试将其付诸实践将有助于您理解它。

它特定于实体框架,但原则仍适用于非EF工作。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

答案 4 :(得分:0)

您可以查看IoC容器,例如Castle WindsorSpringFramework.netStructureMap。这是他们的目标核心。