Что корректный путь состоит в том, чтобы инициализировать модель и представление в CAL WPF MVVM

Я приехал через два способа инициализировать Представления и ViewModels в CAL WPF MVVM.

1 - Кажется, более популярен. Требует, чтобы Вы разрешили ViewModel для автоматического разрешения Представления. ViewModel содержит информацию о Представлении.

    public interface IView
    {
        void SetModel(IViewModel model);
    }

    public interface IViewModel
    {
        IView View { get; }
    }

    public class View
    {
        public void SetModel(IViewModel model)
        {
            this.DataContext = model;
        }
    }

    public class ViewModel
    {
        private IView view;

        public ViewModel(IView view)
        {
            this.view = view;
        }

        public IView View { return this.view; }
    }

2 - Кажется намного более чистым и удаляет Представление из ViewModel. Требует, чтобы Вы разрешили Представление для автоматического разрешения ViewModel. Вводит объекты в представление (Не уверенный, если это хорошо или не).

    public interface IView
    {
    }

    public interface IViewModel
    {
    }

    public class View
    {
        private IViewModel model;

        public View(IUnityContainer unityContainer)
        {
            this.model = unityContainer.Resolve<IViewModel>();
            this.DataContext = this.model;
        }
    }

    public class ViewModel
    {
    }

Что является принятым методом инициализации представлений и моделей и что является преимуществами и недостатками каждого метода. Необходимо ли вводить объекты в представление?

5
задан anon 15 January 2010 в 15:38
поделиться

3 ответа

Несколько вещей, с которыми вы должны иметь дело непосредственно на языке C, которые другие языки абстрагируются от вас, включают явное управление памятью ( malloc ) и непосредственно с указателями.

Моя девушка один семестр после окончания MIT (где они в основном используют Java, Scheme и Python) со степенью Computer Science, и она в настоящее время работает в компании, кодовая база которой на C++. В течение первых нескольких дней ей было трудно понять все указатели/ссылки/и т.д.

С другой стороны, я обнаружил, что перемещение от C++ к Java очень легко, потому что я никогда не путался в отношении передачи ссылок-по-значению в сравнении с передачей-по-ссылке.

Аналогично, в C/C + + гораздо более очевидно, что примитивы являются просто компилятором, обрабатывающим одни и те же наборы битов по-разному, в отличие от языка, такого как Python или Ruby, где все является объектом со своими собственными отличными свойствами.

-121--2444779-

Мой опыт обучения студентов и работы с людьми, которые изучали только языки высокого уровня, заключается в том, что они склонны думать на определенном высоком уровне абстракции, и они предполагают, что «все приходит бесплатно». Они могут стать очень компетентными программистами, но в конечном итоге им приходится иметь дело с каким-то кодом, который имеет проблемы с производительностью, и тогда дело доходит до того, чтобы укусить их.

Когда вы много работаете с C, вы действительно думаете о выделении памяти. Вы часто думаете о компоновке памяти (и локализации кэша, если это проблема). Вы понимаете, как и почему определенные графические операции стоят очень дорого. Насколько эффективны или неэффективны определенные варианты поведения сокетов. Как работают буферы и т.д. Я чувствую, что использование абстракций на языке более высокого уровня, когда вы знаете, как он реализован под обложками, иногда дает вам «этот лишний секретный соус», когда вы думаете о производительности.

Например, в Java есть сборщик мусора, и нельзя напрямую назначать вещи памяти. Кроме того, можно выбрать определенный дизайн (например, с помощью пользовательских структур данных). которые влияют на производительность по тем же причинам, это будет проблемой в C.

Также, и в более общем плане, я считаю, что для силового программиста важно не только знать нотацию большого (чему учит большинство школ), но что в реальных приложениях также важна константа (которую школы стараются игнорировать). Мой анекдотический опыт заключается в том, что люди с навыками на обоих уровнях языка, как правило, лучше понимают постоянную, возможно, из-за того, что я описал выше.

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

-121--2444771-

Они оба действительны, но # 1 имеет тенденцию быть более проверяемым (это, по крайней мере, делает ваши тесты более сжатыми).Преимущество # 2 в том, что он имеет тенденцию быть более явным и делает обслуживание немного более ясным, особенно когда у вас много оборота, такого рода вещи. Требует меньше объяснений (хотя это не повод для его принятия, это просто трюизм).

Отличие состоит в том, что # 1 называется «Впрыск зависимости» , а # 2 - «Местоположение услуги» . Их часто путают, потому что они оба обычно используют какой-то контейнер IoC (хотя это не обязательно).

Это вопрос предпочтения в конце концов, но, как я сказал, я думаю, вы найдете # 1 намного легче проверить... при тестировании и издевательствах не требуется использовать интерфейс IUnityContainer.

3
ответ дан 14 December 2019 в 08:51
поделиться

Вариант 1 выглядит правильно, дать представление ссылки на ViewModel.

Наличие ViewModels со ссылкой назад к мнению, кажется мне немного рыбным для меня. Это выглядит больше похоже на архитектуру типа презентатора-представления модели. Если у вас есть ViewModels, которые взаимодействуют с Viewly с видом и нуждаются в ссылке на просмотр, к тому, что вам может быть лучше разделить ViewModel в ViewModel, используемой исключительно для DATABINDING, и ведущего, который делает более сложное взаимодействие.

Вариант 2 вообще не выглядит прямо. Передача ссылки на контейнер IOC в классы - это большой запах кода в моей книге. Вызывы на контейнер IOC должны быть минимизированы. В большинстве моих приложений я звоню только в контейнер только в начале программы для проводов. Более динамическое создание объекта обычно делается с заводскими классами.

1
ответ дан 14 December 2019 в 08:51
поделиться

Я предпочитаю определить модель просмотра в XAML и предоставить свойство только для чтения для напечатанного доступа:

<UserControl ...>
    <UserControl.DataContext>
        <local:MyViewModel/>
    </UserControl.DataContext>

    ...

</UserControl>

public partial class MyView : UserControl, IMyView
{
    public MyViewModel ViewModel
    {
        get { return this.DataContext as MyViewModel; }
    }

    ...
}
2
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: