5

Я пытаюсь понять Разницу между инжекцией зависимостей и шаблоном репозитория.Разница между впрыском зависимостей и шаблоном репозитория

Согласно моему пониманию, шаблон репозитория делает все, что делает инъекция зависимостей, за исключением Injection Dependency, мы используем 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; 
} 
} 

Для DI Initialize Зависимость в Bootstrap.cs

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 инъекций
  • Цените Если кто-то может объяснить Bootstrap.cs код файла и код класса контроллера с максимально возможными деталями.

Источник кода: http://www.dotnet-tricks.com/Tutorial/dependencyinjection/632V140413-Dependency-Injection-in-ASP.NET-MVC-4-using-Unity-IoC-Container.html

+5

'В чем разница между шаблоном репозитория и DI? Это сравнение яблок и апельсинов. – McGarnagle

+0

@McGarnagle Спасибо. Мой пример в основном создает репозиторий, единственное, что здесь имеет значение, - это инсталляция конструктора (DI) для достижения IOC. Мой вопрос в том, что это выгодно? Цените свое понимание. – Lynnw

+1

@McGarnagle Впрыскивание зависимостей дает объект своим переменным экземпляра. Если вы внимательно прочитаете IOC, вкратце, он просто просит добавить интерфейс для создания абстракции, это то, что также создает шаблон репозитория ... и это причина, по которой я задал вопрос об ошибке. Проблема в StackOverflow заключается в том, что люди очень жесткие, и это полностью мое восприятие, основанное на полученном мной комментарии. Когда вы не знаете ответа, что является причиной для комментариев? Просто чтобы получить дополнительные баллы, чтобы показать вам своего босса? – Lynnw

ответ

7

Они действительно не являются сопоставимыми хранилище является то, что вы можете вводить через инъекцию зависимостей. Цель DI заключается в том, чтобы ваше приложение было слабо связано. Вместо того, чтобы указывать конкретную реализацию, вы можете указать интерфейс, который определяет контракт, который должна выполнить реализация. Таким образом, вы можете легко заменить реализацию.

Шаблон хранилища, определенный Мартином Фаулером, изолирует ваш домен от заботы о том, как хранилище реализовано, поэтому все извлеченные объекты могут обрабатываться как в коллекции памяти. У вас может быть репозиторий на основе базы данных, XML-файла текстового документа или чего-то еще. Сам код приложения не волнует. Это делает его очень полезным для тестирования, следовательно, для подключения к TDD.

Вы передаете (вводят) зависимости от контроллера. Это могут быть хранилища, службы или все, что требуется вашему контроллеру. Ваш контейнер IoC соединяет все это вместе во время работы. Это само по себе очень эффективно, мы очень сильно используем DI в приложении SaaS, где клиенты имеют свои собственные реализации, которые вводятся в зависимости от клиента.

Я рекомендую вам прочитать Dependency Injection in .NET.Марк Seemann может объяснить это намного лучше, чем я, и является отличным введением к хау, и вы должны использовать DI и различные IoC Containers, например. Единство

+0

Спасибо. Мой пример в основном создает репозиторий, единственное, что здесь имеет значение, - это инсталляция конструктора (DI) для достижения IOC. Мой вопрос в том, что это выгодно? Цените свое понимание. – Lynnw

3

В чем разница между Repository Pattern и DI

Я не думаю, что есть смысл сравнения вы можете сделать. Они оба являются методами программирования, но они возникают из очень разных соображений. (c.f. The Repository Pattern, Dependency Injection)

Я думаю, вы могли бы сказать, что они связаны таким образом: хранилище данных является примером внешней зависимости, которую ваша инфраструктура DI обычно вводит в объекты, которые в ней нуждаются.

Что такое преимущество Constructory Injection

ли вы имеете в виду, в отличие от other injection patterns? Затем: инъекция конструктора позволяет вам получить доступ к вложенным зависимостям, когда объект сначала инициализируется.

Или вы имеете в виду, в чем преимущество использования DI в целом? Это очень широкий вопрос, но я бы сказал: когерентная структура для вашего приложения и менее жесткая связь между его компонентами.

Оцените, если кто-то может объяснить код файла Bootstrap.cs и код класса контроллера с максимально возможными деталями.

Класс «Bootstrapper» в Unity, аналогично классу «Kernel» в Ninject, реализует так называемый «слой композиции» DI-шаблона. Здесь вы указываете своему контейнеру DI, как он должен разрешать все зависимости, которые он найдет в вашем приложении. Это в основном означает согласование введенных интерфейсов с их реализациями и предоставление инструкций по объему инъецируемых объектов (т. Е. Singleton, per request или переходный процесс).

+0

Большое вам спасибо за ваш ответ. – Lynnw

Смежные вопросы