C# 使用双构造函数的依赖注入与使用DI框架的单构造函数的依赖注入
在单元测试的上下文中,可以创建两个控制器构造函数,一个默认情况下控制器工厂将使用,另一个专用于单元测试C# 使用双构造函数的依赖注入与使用DI框架的单构造函数的依赖注入,c#,asp.net-mvc,unit-testing,dependency-injection,repository-pattern,C#,Asp.net Mvc,Unit Testing,Dependency Injection,Repository Pattern,在单元测试的上下文中,可以创建两个控制器构造函数,一个默认情况下控制器工厂将使用,另一个专用于单元测试 public class ProductController : Controller { private IProductRepository repository; public int PageSize = 10; // default constructor public ProductController() { this.repository =
public class ProductController : Controller
{
private IProductRepository repository;
public int PageSize = 10;
// default constructor
public ProductController()
{
this.repository = new ProductRepository();
}
// dedicated for unit testing
public ProductController(IProductRepository productRepository)
{
this.repository = productRepository;
}
public ViewResult List(int page=1)
{
return View(repository.Products
.OrderBy(p => p.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize));
}
}
单元测试可以通过这种方式实现
[TestMethod]
public void Can_Paginate()
{
// Arrange
Mock<IProductRepository> mock = new Mock<IProductRepository>();
mock.Setup(m => m.Products).Returns(new Product[]
{
new Product {ProductID = 1, Name = "P1"},
new Product {ProductID = 2, Name = "P2"},
new Product {ProductID = 3, Name = "P3"},
new Product {ProductID = 4, Name = "P4"},
new Product {ProductID = 5, Name = "P5"}
}.AsQueryable());
ProductController controller = new ProductController(mock.Object);
controller.PageSize = 3;
// Act
IEnumerable<Product> result =
(IEnumerable<Product>)controller.List(2).Model;
// Assert
Product[] prodArray = result.ToArray();
Assert.IsTrue(prodArray.Length == 2);
Assert.AreEqual(prodArray[0].Name, "P4");
Assert.AreEqual(prodArray[1].Name, "P5");
}
[TestMethod]
公共空间可以分页()
{
//安排
Mock Mock=新Mock();
mock.Setup(m=>m.Products).Returns(新产品[]
{
新产品{ProductID=1,Name=“P1”},
新产品{ProductID=2,Name=“P2”},
新产品{ProductID=3,Name=“P3”},
新产品{ProductID=4,Name=“P4”},
新产品{ProductID=5,Name=“P5”}
}.AsQueryable());
ProductController=新的ProductController(mock.Object);
controller.PageSize=3;
//表演
可数结果=
(IEnumerable)控制器。列表(2)。模型;
//断言
Product[]prodArray=result.ToArray();
Assert.IsTrue(prodArray.Length==2);
Assert.AreEqual(prodArray[0].Name,“P4”);
AreEqual(prodArray[1].Name,“P5”);
}
在上面,我能够实现单元测试。我的问题是,如果我可以使用专用构造函数实现DI,为什么我会选择使用DI框架(如Unity、Ninject等)?我一定错过了一些明显的东西
(顺便说一句,上面的代码示例大部分来自Adam Freeman的Pro ASP.NET MVC 4书籍,我对其进行了一些修改,以适合我需要问的问题)在这个简单的示例中。。技术上没有理由 框架的要点是全局管理依赖关系及其存在的各个部分。。。不仅仅是注入依赖项。生命周期/范围、方式/时间、地点/原因。这里的内容仍然与
ProductRepository
紧密耦合。。。只有这样
在一个复杂的应用程序中,您当前所拥有的需要如下所示:
this.repository = new ProductRepository(
new ShoppingCartRepository(
new Logger()),
new ReviewsRepository(
new Logger()),
new Logger());
…而对于DI/IoC框架,您不必担心任何布线和所有潜在的生存期/连接逻辑。Related:Related: