Я приехал через два способа инициализировать Представления и 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
{
}
Что является принятым методом инициализации представлений и моделей и что является преимуществами и недостатками каждого метода. Необходимо ли вводить объекты в представление?
Несколько вещей, с которыми вы должны иметь дело непосредственно на языке 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.
Вариант 1 выглядит правильно, дать представление ссылки на ViewModel.
Наличие ViewModels со ссылкой назад к мнению, кажется мне немного рыбным для меня. Это выглядит больше похоже на архитектуру типа презентатора-представления модели. Если у вас есть ViewModels, которые взаимодействуют с Viewly с видом и нуждаются в ссылке на просмотр, к тому, что вам может быть лучше разделить ViewModel в ViewModel, используемой исключительно для DATABINDING, и ведущего, который делает более сложное взаимодействие.
Вариант 2 вообще не выглядит прямо. Передача ссылки на контейнер IOC в классы - это большой запах кода в моей книге. Вызывы на контейнер IOC должны быть минимизированы. В большинстве моих приложений я звоню только в контейнер только в начале программы для проводов. Более динамическое создание объекта обычно делается с заводскими классами.
Я предпочитаю определить модель просмотра в XAML и предоставить свойство только для чтения для напечатанного доступа:
<UserControl ...>
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
...
</UserControl>
public partial class MyView : UserControl, IMyView
{
public MyViewModel ViewModel
{
get { return this.DataContext as MyViewModel; }
}
...
}