MVVM и внедрение зависимостей - PullRequest
6 голосов
/ 07 июня 2011

В настоящее время я изучаю шаблон MVVM, и в учебнике, которому я следую, используется Unity для DI. Я до сих пор не использовал DI таким образом и просто хотел уточнить свои мысли о том, как работает этот конкретный код.

В представлении, которое у меня есть:

private ViewModel vm;

    [Dependency]
    public ViewModel VM
    {
        set
        {
            vm = value;
            this.DataContext = vm;
        }

    }

, где атрибут зависимости говорит Unity для внедрения здесь. Конструктор ViewModel принимает объект IQuoteSource, который зарегистрирован в Unity следующим образом:

        IUnityContainer container = new UnityContainer();
        RandomQuoteSource randomQuoteSource = new RandomQuoteSource();
        container.RegisterInstance<IQuoteSource>(randomQuoteSource);
        MainWindow window = container.Resolve<MainWindow>();
        window.Show();

Как именно это работает, поскольку я никогда не создаю явно объект ViewModel, используя свойство выше. Все это обрабатывается в Unity, и если да, то как это достигается?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 07 июня 2011

Это не имеет ничего общего с шаблоном MVVM как таковым, за исключением того факта, что зависимость представления от его ViewModel разрешается путем внедрения зависимости.

Как это работает, все довольно просто. Есть три простых понятия для DI:

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

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

Третий - это то, что склеивает вещи, то есть разрешение зависимостей , где вы просите контейнер разрешить какой-то тип для вас, и он изучает, какие зависимости этот объект объявил (в вашем случае вы решаете MainWindow, который зависит от ViewModel), находит правильную зарегистрированную реализацию и разрешает ее. Это поведение распространяется касательно разрешения графа объектов (что разрешает зависимость ViewModel от IQuoteSource).

Надеюсь, это поможет:)

0 голосов
/ 07 июня 2011

Это MainWindow, к которому принадлежит свойство VM? Если нет, то я предполагаю, что разрешение MainWindow запускает некоторый каскад разрешения, который в какой-то момент включает в себя создание объекта, обладающего свойством VM в вашем примере.

Unity проверяет каждый объект, который должен разрешить в каскаде, для свойств, отмеченных [Dependency], и создает объект зависимого типа свойства. Когда он создает объекты, подобные этому, он выбирает конструктор, который имеет большинство параметров, которые он знает, как создать, и именно здесь происходит регистрация IQuoteSource -> RandomQuoteSource.

...