Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 使用双构造函数的依赖注入与使用DI框架的单构造函数的依赖注入_C#_Asp.net Mvc_Unit Testing_Dependency Injection_Repository Pattern - Fatal编程技术网

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: