依赖注入与存储库模式的区别

时间:2014-01-28 19:34:05

标签: asp.net asp.net-mvc dependency-injection repository-pattern

我试图理解依赖注入和存储库模式之间的区别。

根据我的理解,Repository Pattern会执行Dependency Injection正在执行的所有操作,除了在Dependency Injection中我们使用的是Constructor Injection。

好的,让我试着解释一个例子:(请注意我使用Unity Framework进行DI)

创建产品类

public class Product
{
 public int Id { get; set; }
 public string Name { get; set; }
 public string Category { get; set; }
 public decimal Price { get; set; }
}

在模型上创建界面

public interface IProductRepository
{
 IEnumerable<Product> GetAll();
 Product Get(int id);
 Product Add(Product item);
 bool Update(Product item);
 bool Delete(int id);
}

实施界面

//ProductRepository.cs
public class ProductRepository : IProductRepository
{
 private List<Product> products = new List<Product>();
 private int _nextId = 1;

 public ProductRepository()
 {
 // Add products for the Demonstration
 Add(new Product { Name = "Computer", Category = "Electronics", Price = 23.54M });
 Add(new Product { Name = "Laptop", Category = "Electronics", Price = 33.75M });
 Add(new Product { Name = "iPhone4", Category = "Phone", Price = 16.99M });
 }

 public IEnumerable GetAll()
 {
 // TO DO : Code to get the list of all the records in database
 return products;
 }
 public Product Get(int id)
 {
 // TO DO : Code to find a record in database
 return products.Find(p => p.Id == id);
 }
 public Product Add(Product item)
 {
 if (item == null)
 {
 throw new ArgumentNullException("item");
 }

 // TO DO : Code to save record into database
 item.Id = _nextId++;
 products.Add(item);
 return item;
 }
 public bool Update(Product item)
 {
 if (item == null)
 {
 throw new ArgumentNullException("item");
 }

 // TO DO : Code to update record into database
 int index = products.FindIndex(p => p.Id == item.Id);
 if (index == -1)
 {
 return false;
 }
 products.RemoveAt(index);
 products.Add(item);
 return true;
 }
 public bool Delete(int id)
 {
 // TO DO : Code to remove the records from database
 products.RemoveAll(p => p.Id == id);
 return true;
 }
}

对于Bootstrap.cs中的DI Initialize Dependency

private static IUnityContainer BuildUnityContainer()
{
 var container = new UnityContainer();

 // register all your components with the container here
 // it is NOT necessary to register your controllers

 container.RegisterType<IProductRepository, ProductRepository>();

 // e.g. container.RegisterType<ITestService, TestService>(); 

 RegisterTypes(container);

 return container;
}

控制器

public class ProductController : Controller
{
 readonly IProductRepository repository;

 //inject dependency
 public ProductController(IProductRepository repository)
 {
 this.repository = repository; 
 }

 public ActionResult Index()
 {
 var data = repository.GetAll();
 return View(data);
 }
 //Other Code
}

我的问题

  • Repository Pattern和DI
  • 之间有什么区别
  • Constructory Injection的优点是什么
  • 感谢如果有人能够解释Bootstrap.cs文件代码和Controller类代码,并提供最多可能的详细信息。

代码来源:http://www.dotnet-tricks.com/Tutorial/dependencyinjection/632V140413-Dependency-Injection-in-ASP.NET-MVC-4-using-Unity-IoC-Container.html

2 个答案:

答案 0 :(得分:9)

它们真的无法比较存储库是您可以通过依赖注入注入的东西。 DI的目的是使您的应用程序松散耦合。您可以指定一个接口来定义实现必须满足的合同,而不是指定具体的实现。这样你就可以更轻松地交换实现。

Martin Fowler定义的存储库模式将您的域与关心如何实现存储隔离开来,因此所有检索到的对象都可以像内存集合一样对待。您可以拥有基于数据库,XML文件,文本文档或任何内容的存储库。应用程序代码本身并不关心。这使得它非常适用于测试与TDD的连接。

您将(注入)依赖性传递给控制器​​。这些可能是存储库,服务或控制器所需的任何内容。您的IoC容器在运行时将所有这些连接在一起。这本身就非常强大,我们在SaaS应用程序中大量使用DI,客户有自己的实现,这些实现根据客户端有条件地注入。

我建议你阅读Dependency Injection in .NET。 Mark Seemann可以比我更好地解释这一点,并且是对你应该使用DI和各种IoC Containers的方法的一个很好的介绍。统一

答案 1 :(得分:5)

  

存储库模式与DI之间有什么区别

我不认为你可以做出有意义的比较。它们都是编程技术,但它们来自非常不同的考虑因素。 (c.f。The Repository PatternDependency Injection

我想你可以说它们是以这种方式连接的:数据存储库是你的DI框架通常会注入需要它的对象的外部依赖的一个例子。

  

Constructory Injection的优点是什么

你是说,而不是other injection patterns?然后:构造函数注入允许您在首次初始化对象时访问注入的依赖项。

或者你的意思是,一般使用DI有什么好处?这是一个非常广泛的问题,但我会说:应用程序的连贯结构,以及组件之间的刚性耦合较少。

  

欣赏如果有人能够解释Bootstrap.cs文件代码和Controller类代码,并提供最多可能的详细信息。

Unity中的“Bootstrapper”类与Ninject中的“Kernel”类类似,实现了DI模式的所谓“组合层”。在这里,您可以告诉您的DI容器如何解决它在整个应用程序中找到的所有依赖关系。这基本上意味着将注入的接口与其实现进行匹配,并提供有关注入对象范围的指令(即单例,每个请求或瞬态)。