Должен ли я использовать Microsoft.Practicies.Unity.IUnityContainer в своем приложении MVVM? - PullRequest
1 голос
/ 20 ноября 2011

Джейсон Долингер в своем видео, расположенном здесь (горячая версия доступна прямо сейчас) www.lab49.com/files/videos/Jason%20Dolinger%20MVVM.wmv (от 0,59 до 1,04) использует такой код:

public partial App: Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        IUnityContainer container = new UnityContainer();
        RandomQuoteSource source = new RandomQuoteSource();
        container.RegisterInstance<IQuoteSource>(source);

        WatchList window = container.Resolve<WatchList>();
        window.Show();
    }
}

Он использует класс IUnityContainer, который я не могу найти. Как я понимаю здесь, мы просто создаем окно (так что container.Resolve вызов может быть заменен на new WatchList(..., также мы каким-то образом ассоциируем RandomQouteSource как реализацию для IQouteSource, однако у меня нет четкого понимания, как это должно быть используется позже.

Вопросы:

  • как вы создаете основную Windows в приложении MVVM, вы также используете для этого IUnityContainer?
  • это хорошая техника в целом? это хорошо известно? это способ по умолчанию делать эти вещи? Какие у меня есть альтернативы?
  • где я могу найти Microsoft.Practicies.Unity.dll?

Ответы [ 4 ]

7 голосов
/ 20 ноября 2011

Должен ты?

Это решать тебе.Это может быть сложно.Если вы используете его правильно, это может стоить того, как для вашего кода, так и для вашего знания о том, как работает ваш код.

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

Вам придется прочитать несколько статей на эту тему и посмотреть, имеет ли это для вас смысл.

(если честно, это действительно не сложно - просто так кажется, когда вы изучаете это или пытаетесь объяснить это кому-то, кто плохо знаком с понятиями)

Unity и Dependency Injection

IUnityContainer является частью Unity , который является Dependency Injection containerбиблиотека.

Может быть объединена с PRISM фреймворком для использования в WPF / Silverlight.

Внедрение зависимостей имеет много правил, которым вы хотите следовать, чтобы получитьмаксимальная выгода.Я не вижу простого или эффективного руководства по началу работы на сайте Unity, и книга Марка Симанна о внедрении зависимостей в .Net не является бесплатной.

Поэтому вместо этого я предлагаю вамознакомьтесь с вводным руководством по внедрению зависимостей на сайте с хорошим руководством:

Это не платформа Unity, поэтомукод не будет компилироваться напрямую ...

... но он должен научить вас, что такое Dependency Injection и почему вы хотите его использовать.Тогда вы сможете следовать образцу кода и видео на странице Unity.

Если вы пропустите эти шаги, вы очень быстро запутаетесьи, вероятно, выстрелит себе в ногу по крайней мере несколько десятков раз.

Создание Windows

Контейнер не используется, кроме как в одной этой функции.Используйте его где-нибудь еще, и вы не используете контейнер DI правильно.Вы просто будете использовать контейнер для регистрации ваших представлений, просмотра моделей и моделей, разрешить главного окна, которое вы ранее зарегистрировали, и утилизировать контейнер, когда закончите.

Этот процессназывается «Модель трех вызовов».К сожалению, у меня нет общих примеров для Unity, но вот статья о шаблоне трех вызовов для еще одной библиотеки контейнеров DI .

Вы также можете увидеть это упомянутое в этомNinject учебник, который я связал выше.

0 голосов
/ 20 ноября 2011

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

Самый простой способ включить Unity в ваш проект - использовать Nuget. просто выпуск: установить пакет единство. Вы также можете скачать двоичные файлы и исходные коды и получить намного больше информации в проекте codeplex для единства: http://unity.codeplex.com/.

0 голосов
/ 20 ноября 2011

Одно из предложений: Ninject - легкий, простой в использовании DI-инструмент.

0 голосов
/ 20 ноября 2011

Это хорошо известный метод, называемый Внедрение зависимостей .

Альтернативой является создание необходимой зависимости вручную.

Вы можете скачать сборки Unity на шаблонах и практиках - Unity из codeplex.

Взгляните на статью codeproject для учебника.

Я не работал с wpf, но я бы пошел тем же путем, чтобы минимизировать зависимости и получите лучшую тестируемость.

Редактировать

Вот еще один пример из codeplex .

Но прочитайте эту статью отсюда стека сначала , потому что это кажется болью

...