Внедрение зависимостей MVVM

Я нахожусь в процессе обучения шаблону MVVM, разделяя шаблон на его основные аспекты и изучая эти аспекты один за другим.

Мой вопрос связан с внедрением зависимостей. Что это такое и почему/когда я должен его использовать? Я посмотрел превосходное вступительное видео Джейсона Долинджера по MVVM и увидел, что он использует Unity. Это может показаться странным, но как мне реализовать внедрение зависимостей БЕЗ использования Unity? В основном я хочу понять концепцию внедрения зависимостей и то, как ее использовать без необходимости реализации других фреймворков/инструментов (пока).

Спасибо.


person user823486    schedule 03.06.2012    source источник


Ответы (2)


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

Допустим, вы хотите использовать какой-то вид транспорта.

interface ITransportation 
{
  Transport();
}

Первоначальная реализация метода, использующего вид транспорта, может выглядеть так:

public void Move()
{
  ITransportation car = new Car();
  car.Transport();
}

Проблема этого метода в том, что теперь он зависит от класса Car. Мы должны передать наш транспортный объект для дополнительной гибкости. Это инверсия управления, тесно связанная с DI.

public void Move(ITransportation tr)
{
  tr.Transport();
}

Как видите, нам не нужно ничего знать о конкретной структуре DI. Вы также можете ознакомиться с руководством по внедрить DI вручную. .

person Andy Gaskell    schedule 03.06.2012
comment
Спасибо за ответ Энди. Буду ли я тогда прав, утверждая, что внедрение зависимостей в контексте представлений и моделей представления используется для отделения представления от его базовой модели представления? - person user823486; 03.06.2012
comment
Немного больше контекста может быть полезным. Мы говорим о WPF/Silverlight или о чем-то другом? - person Andy Gaskell; 03.06.2012
comment
Привет. Я исследую DI в контексте WPF. - person user823486; 04.06.2012
comment
@AndyGaskell Привет, не могли бы вы взглянуть на мой вопрос, который также имеет отношение к внедрению зависимостей - person WiiMaxx; 19.02.2015

Просто чтобы расширить ответ @Andy

Внедрение зависимостей — это одна из форм принципа инверсии зависимостей.

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

Один потенциальный «сдвиг мышления» заключается в том, что зависимости теперь потенциально становятся общедоступными для конкретных классов, поскольку DI обычно внедряет через конструкторы или общедоступные свойства Get/Set. Это может показаться странным, если вы привыкли использовать объектно-ориентированную инкапсуляцию, где зависимости класса рассматриваются как реализация и должны быть скрыты от «снаружи», то есть от сигнатур методов класса. Однако, реализуя разделение классов Interface/Concrete (как вы и должны, не только для развязки, но и для целей тестирования/мока), конструкторы внедрения/методы внедрения свойств не будут находиться на интерфейсе, поэтому инкапсуляция снова на месте.

Re: "Выполнение внедрения зависимостей вручную" без Unity и т. д.

Что вам нужно сделать, так это закодировать свой собственный контейнер IoC, который затем отвечает за «создание» экземпляров классов — во время каждого «сборки» вы будете сканировать класс на наличие зависимостей (которые настроены в контейнере, например по конфигурации, по атрибутам или просто по соглашению, например, все общедоступные устанавливаемые свойства или любые параметры класса в конструкторе будут считаться зависимостями). Затем вы должны создать (при необходимости) и внедрить этот экземпляр «зависимости» в объект (например, с помощью отражения). И затем рекурсивно необходимо создать все зависимости этих зависимостей и т. д. Затем вам также потребуется обеспечить управление сроком службы для каждого из объектов, например. Синглтоны и т.д.

person StuartLC    schedule 03.06.2012