Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解耦控制器中的依赖项?_C#_Asp.net Mvc 3 - Fatal编程技术网

C# 如何解耦控制器中的依赖项?

C# 如何解耦控制器中的依赖项?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我希望能够编写测试代码。但我的行为与我的数据上下文相关联。如何删除依赖关系 public ViewResult About() { var db = new CamaDataContext(); var item = new PropertyViewModel(); AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item); return Vie

我希望能够编写测试代码。但我的行为与我的数据上下文相关联。如何删除依赖关系

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

        var item = new PropertyViewModel();


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

        return View(item);
    }

您可以查看IoC容器,例如,或。这是设计它们的核心功能。

您可以查看IoC容器,例如,或。这是他们设计的核心

  • 为不同的实体创建存储库接口

  • 为不同的实体创建具体的存储库

  • 在控制器级别存储这些存储库

  • 使用控制器的构造函数允许注入存储库(如果没有提供具体实现,则使用具体实现)

  • 这将允许您在单元测试期间模拟存储库,以避免两者紧密耦合

  • 为不同的实体创建存储库接口

  • 为不同的实体创建具体的存储库

  • 在控制器级别存储这些存储库

  • 使用控制器的构造函数允许注入存储库(如果没有提供具体实现,则使用具体实现)


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

    使用依赖项注入框架(如ninject或structuremap)将其传递到控制器的构造函数中,然后在编写测试时,您可以在Think构造函数中传递这些依赖项


    这还将为您提供模拟这些依赖项的机会,而不必在测试时实际调用数据库

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


    这还将为您提供模拟这些依赖项的机会,而不必在测试时实际调用数据库

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

    另一种方法是,让控制器的动作非常轻量级,因此可能不需要测试

    另请注意,处置上下文类:

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

    还考虑了[AutoPo[()]属性,以保持您的动作方法更薄。


    我认为控制器中的两行方法不需要测试。

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

    另一种方法是,让控制器的动作非常轻量级,因此可能不需要测试

    另请注意,处置上下文类:

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

    还考虑了[AutoPo[()]属性,以保持您的动作方法更薄。


    我希望控制器中的两行方法不需要测试。

    微软在这方面有很好的教程。这并不完全是直截了当的,但好好学习课程并尝试将其付诸实践将有助于你更好地理解它

    其具体适用于实体框架,但原则仍适用于非EF工作


    微软在这方面有很好的教程。这并不完全是直截了当的,但好好学习课程并尝试将其付诸实践将有助于你更好地理解它

    其具体适用于实体框架,但原则仍适用于非EF工作


    存储库还应该与工作单元相关联,否则他会将数据库代码与存储库混合在一起(除非他不需要事务支持)。@Christopherraris-我遗漏了这一部分。这完全取决于系统是如何构建的。如果他们使用依赖项注入,你可以把管理上下文的责任推到那里,让存储库不用担心上下文。有人能详细说明一下你将我的repo与工作单元关联的意思吗?@Justin,我也这么认为,但你如何提交更改?对每个存储库的保存调用?但这些方法中的每一种都只会保存底层上下文。这不是很枯燥,因此需要UnitOfWork.Save();方法。存储库还应该与一个工作单元相关联,否则他会将数据库代码与存储库混合在一起(除非他不需要事务支持)。@Christopherraris-我遗漏了这一部分。这完全取决于系统是如何构建的。如果他们使用依赖项注入,你可以把管理上下文的责任推到那里,让存储库不用担心上下文。有人能详细说明一下你将我的repo与工作单元关联的意思吗?@Justin,我也这么认为,但你如何提交更改?对每个存储库的保存调用?但这些方法中的每一种都只会保存底层上下文。这不是很枯燥,因此需要UnitOfWork.Save();方法。