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();方法。