Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175

Разделение функционала между слоями MVVM на примере создания простого WPF приложения с БД

10.02.2024, 00:12. Показов 8863. Ответов 182
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема создана разделением темы Вывод на печать изображения MVVM


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы имеете - некое свойство может иметь значения разных типов (или даже одного типа) и View выводит разные представления для разных значений, то это снимает часть противоречий.
Да про это. например в
XML
1
 <ContentControl Grid.Column="1" Content="{Binding CurrentView}"></ContentControl>
идет привязка к свойству CurrentView, оно же изменяется при переключение RadioButton. То есть от выбранного RadioButton зависит какой контент будет у ContentControl. Получается что представление очень зависимо от свойства CurrentView.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class MainWindowVM : ViewModelBase
    {
        public MainWindowVM()
        {
            //Создаём команды
            OpenUserControl1Command = new RelayCommand(OpenUserControl1);
            OpenUserControl2Command = new RelayCommand(OpenUserControl2);
            OpenUserControl3Command = new RelayCommand(OpenUserControl3);
 
            OpenOtherControlCommand = new RelayCommand(OpenOtherControlCommandExecute);
        }
        #region открытие user control
        private object _popupCurrentView;
 
        public object PopupCurrentView
        {
            get => _popupCurrentView;
            set
            {
                _popupCurrentView = value;
                OnPropertyChanged(nameof(PopupCurrentView));
            }
        }
        public ICommand OpenOtherControlCommand { get; private set; }
        public void OpenOtherControlCommandExecute(object obj) => PopupCurrentView = new SelectLangue();
 
        public ICommand CloseOtherControlCommand { get; private set; }
        public void CloseOtherControlCommandExecute(object obj) => PopupCurrentView = null;
        #endregion
 
        private object _currentView;
 
        /// <summary>
        /// ListcurrentView нужен для хранения состояния UserControl. 
        /// Все действия над представлением и изменением контента сохраняются в этой коллекции. 
        /// Если хранить  представление и изменением контента не нужно. Тогда лучше удалить эту коллекцию и связанный с ней метод.
        /// </summary>
        private List<UserControl> ListcurrentView = new();
 
        /// <summary>
        /// Отображание текущего UserContol в ContentControl в окне MainWindow
        /// </summary>
        public object CurrentView
        {
            get => _currentView;
            set
            {
                _currentView = value;
                OnPropertyChanged(nameof(CurrentView));
            }
        }
        #region Команды для отображения UserControl в окне MainWindow
        public ICommand OpenUserControl1Command { get; }
        private void OpenUserControl1(object obj) => CurrentView = GetOrAddUserControl<UserControl1>();
 
        public ICommand OpenUserControl2Command { get; }
        private void OpenUserControl2(object obj) => CurrentView = GetOrAddUserControl<UserControl2>();
 
        public ICommand OpenUserControl3Command { get; }
        private void OpenUserControl3(object obj) => CurrentView = GetOrAddUserControl<UserControl3>();
 
        /// <summary>
        /// Универсальный метод для возвращения UserControl из коллекции
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private UserControl GetOrAddUserControl<T>() where T : UserControl, new()
        {
            var control = ListcurrentView.Find(c => c.GetType() == typeof(T));
            if (control == null)
            {
                control = new T();
                ListcurrentView.Add(control);
            }
            return control;
        }
        #endregion
    }


Цитата Сообщение от Элд Хасп Посмотреть сообщение
И такое переключение должно быть реализовано с помощью навигатора в View.
Использование сервисов, чтобы узнать об изменение View?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2024, 00:12
Ответы с готовыми решениями:

ASP.NET MVC - разделение функционала между различными view
Добрый день)) Хочу спросить совета. В своем проекте использую MVC + jQuery, чтобы создать функционал в системе, аналогичный тому, что...

WPF MVVM: варианты создания VM с параметрами
Есть обычная ViewModel: public class SomeViewModel { private readonly ILogger logger; private readonly...

WPF нюансы создания проводника и мелочи по MVVM
Здравствуйте. Я только начинаю осваивать WPF и паттерн MVVM, и вот в чём загвостка: 1) Я уже написал визуальное оформление приложения и...

182
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 13:40  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У вас VM проект имеет прямую ссылку на Model (DataBase).
Сделал чтобы зависели от интерфейсов, модель бд реализует интерфейс и также Vm реализует интерфейс.
И интерфейс у меня хранится в отдельной либе.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сейчас занят.
Постараюсь вечером посмотреть вашу текущую реализацию.
Хорошо
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 17:10
xellan24rus, как меняются свойства DTO сущностей, настройка Code First в моём примере понятна?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 17:16  [ТС]
Элд Хасп, я почти разобрался. реализую в своей ветке такой же функционал.
C#
1
IPeopleModel model = new PeopleModel(fullNameDb);
Тут вы реализуете интерфейс объявляя класс. А почему не объявляется тот же класс?
Типа такого
C#
1
PeopleModel model = new PeopleModel(fullNameDb);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 17:53
Цитата Сообщение от xellan24rus Посмотреть сообщение
Тут вы реализуете интерфейс объявляя класс. А почему не объявляется тот же класс?
Типа такого
Если посмотрите по истории изменений, то увидите что я так и сделал в начале. Но потом я подумал, что будет полезным подчеркнуть, что за пределами App (в котором создаются зависимости), вся работа должна происходить через интерфейсы чтобы не создавать сильных связей.
В консольном приложении код (кроме фрагмента с созданием экземпляра Модели) относится к функционалу View. Поэтому и сделал сохранение в переменной типа интерфейса, а не класса.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 17:57  [ТС]
Элд Хасп, понял, информативно в целях примера) Пока не реализовал подобное в своей ветке, чтобы вникнуть полностью. Но демонстрация хороша. Одна реализация интерфейсов и классов. Но правки кода в одном месте доступны для всех потребителей
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 18:15
Цитата Сообщение от Элд Хасп Посмотреть сообщение
настройка Code First в моём примере понятна?
А это понятно?

А то ваш CreatePeople() прямо "глаза режет".

Что касается именований.
Пример - ApplicationContext.
Что это означает? Контекст приложения. А откуда у этого контекста знание, что он будет использован как единственный контекст приложения? Нету у него такого знания.
Это маленький пример того, что вы мыслите "от View". Отсюда у вас и классы CommandPeople, CommandUser. Чем они командует? Ничем.
Я поэтому и не хотел торопиться с созданием WPF вьюхи. Чтобы вы "прочувствовали", что всё вертится вокруг Модели, а не GUI.
Вот у вас явно в GUI прослеживается наличие состояния "Есть Авторизация". Представление этого состояния есть, но самого состояния в Модели нет!
Так что тогда это Представление представляет? По большому счёту "фигню какую-то"....

Давайте сейчас обсуди Бизнес Логику модели. Потом реализуем её. И только после этого будем думать как эту Модель представлять.

Пока я вижу только три таблицы в БД без связей друг с другом.
Объясните назначение каждой.

Добавлено через 9 минут
Цитата Сообщение от xellan24rus Посмотреть сообщение
демонстрация хороша
Пока не смотрим на безопасность кода. Поэтому DTO-шки у нас используются во многих разных функционалах:
1) Как сущности для парсинга EF запросов, но здесь нужна обязательно правильная настройка схемы БД, а то эффективность будет низка;
2) Как Бизнес Сущности в Модели;
3) Как DTO для передачи данных между Моделью и ViewModel;
4) Как сущность для связывания ViewModel и View;
5) Как прокси для контекста редактированья в View.

В простых приложения такое часто бывает.
Но если нужна безопасность (например в корпоративной, коллективной разработке), то в каждом функционале следует использовать свою реализацию предназначенную только для этого. Это даже не рекомvендация WPF и Шарпа, это общий принцип ООП SOLID "Принцип единственной ответсвенности".
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 18:25  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А это понятно?
Почти разобрался)
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пример - ApplicationContext.
Скорее всего насмотренность, такое именование много где идёт примерах. Но DataBase лучше звучит, но в проекте библиотека так называется...
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Отсюда у вас и классы CommandPeople, CommandUser. Чем они командует
Сейчас простая работа с временными данными, так же как и в gui простой вывод информации в DataGrid, с DataGrid ничего не хочу делать ибо для примера настройка всего на ней, будет больше чем над простыми элементами, ListBox в пример и т.п
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Давайте сейчас обсуди Бизнес Логику модели. Потом реализуем её. И только после этого будем думать как эту Модель представлять.
Первая страница простой вывод в DataGrid, там и делать ничего не нужно. Останется как есть.
Вторая страница - Vm готова, осталось только во View подгрузить всё. Можно вывести в ListBox и добавить поля текстовые для редактирования выбранного элемента в ListBox, помимо этого добавление удаление объектов.
В плане работы с данными думаю достаточно будет, ибо всё будет однотипно и это уже не задачкой, а решением будет, лишняя работа для примера.
Также страницу с переключением темы и языка можно сделать.
В качестве полноценного примера реализации простого приложения пойдёт, ведь есть навигация, работа с данными, локализация, смена тем. Для примера мне и тем кто будет читать тему или разбираться в исходнике, в ознакомительных целях, хороший вариант.

А что ещё добавить можно было, даже не знаю.

Вы не смотрели ещё навигацию по страницам? В плане без переноса NavigationVm в основной проект можно сделать хранение состояний страниц. Или же проще Перенсти навигацию в основу, а дочерние Vm дергать из библиотеки.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока я вижу только три таблицы в БД без связей друг с другом.
Объясните назначение каждой.
У них нет связи, просто загрузка данных в свою страницу. Пример со связью не приходит в мысли для этого проекта.
Если только сделать модель со списком сотрудников, компаний, задач, статистикой и т.п и в разных страницах обрабатывать что то нужное. Но это опять сводится с DataGrid и пример выйдет тогда больше чем нужно, наверное.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 18:31
xellan24rus, и н могу врубиться в логику приложения.
User - People - чем они отличаются?

Можете детальнее объяснить логику которую должно реализовать приложение?

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
Но DataBase лучше звучит, но в проекте библиотека так называется...
Правила именования - это тоже ПРАВИЛА. Если нет каких-то установленных в сообществе, коллективе разработчиков (например, могут быть корпоративные правила для разработки кода), то следует использовать обще принятые.
Например вот эти: Правила именования.

Поэтому базу надо назвать согласно ей предметной области. Что и для чего она хранит? Вот так и назовите.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 18:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока не смотрим на безопасность кода.
Если идёт работа с данными, то их в любом случае можно получить, если с запросами то их можно перехватить\подменить, даже на локальный сервер проксировать для возврата своих ответов.
Или я не том понял.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В простых приложения такое часто бывает.
Но если нужна безопасность (например в корпоративной, коллективной разработке), то в каждом функционале следует использовать свою реализацию предназначенную только для этого. Это даже не рекомvендация WPF и Шарпа, это общий принцип ООП SOLID "Принцип единственной ответсвенности".
Пожалуй как стандарт лучше интерфейс сделать и его наследовать и реализовывать для своих проектов, модели будут однотипны, не забудется никакая часть для реалиации
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 18:33
Цитата Сообщение от xellan24rus Посмотреть сообщение
Первая страница простой вывод в DataGrid, там и делать ничего не нужно.
Первая - это вроде страница авторизации.
Вот её напрочь не пойму.
Любое имя добавляется в БД. Зачем-то устанавливается влаг "авторизирован", но нигде он не проверяется.
Кто такие "Person"? если они не "User"?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 18:40  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
User - People - чем они отличаются?
Пользователь и люди. Пользователь приложения для авторизации только нужен. Люди простой вывод людей, какой то информации о них.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Правила именования - это тоже ПРАВИЛА
Почитаю, давно их читал.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можете детальнее объяснить логику которую должно реализовать приложение?
1 Авторизация
2 Вывод информации о людях, только вывод.
3 вывод продуктов\описание, функционал: редактирование, удаление, добавление.
4 настройки: локализации, смена темы.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Первая - это вроде страница авторизации.
Вот её напрочь не пойму.
Любое имя добавляется в БД. Зачем-то устанавливается влаг "авторизирован", но нигде он не проверяется.
Сначала хотел проверять флаг, но потом подумал что в примере нет смысла этого делать. Флаг можно удалить.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Кто такие "Person"? если они не "User"?
Пользователь User, И люли People, выводим информацию о них, простой пример вывода.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 19:27
Цитата Сообщение от xellan24rus Посмотреть сообщение
Или я не том понял.
Не безопасность эксплуатации приложения, а безопасность разработки.
Например, сейчас DTO используются как сущности. Группа Беккенд разработки наворотила кучу своей логики на уровне Модель, Репозитория, БД: связи между сущностями, валидация значений и др. Вся логика рассчитана на то, что изменение свойств DTO происходит происходит только в Модели.

Но эти же DTO использует и группа фронт разработки. Для них это обычный мутабельный DTO. И если понадобилось где-то изменить значение какого-то свойства - взяли и изменили. А про то, что это может нарушить какую-то логику на уровне Модели они "знать не знают", да, и не должны знать.

Добавлено через 6 минут
Цитата Сообщение от xellan24rus Посмотреть сообщение
1 Авторизация
Объясни логику авторизации.
Как она связана с БД?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 20:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Объясни логику авторизации.
Как она связана с БД?
В данном примере сохранение любого имени и если есть запись в бд, тогда авторизован.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но эти же DTO использует и группа фронт разработки. Для них это обычный мутабельный DTO. И если понадобилось где-то изменить значение какого-то свойства - взяли и изменили. А про то, что это может нарушить какую-то логику на уровне Модели они "знать не знают", да, и не должны знать.
Тут вы правы, лишь бы работало как говорится.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Например, сейчас DTO используются как сущности. Группа Беккенд разработки наворотила кучу своей логики на уровне Модель, Репозитория, БД: связи между сущностями, валидация значений и др. Вся логика рассчитана на то, что изменение свойств DTO происходит происходит только в Модели.
Если углубиться, то это удобная реализация. Связь между данными ничем не ограничена, можно создать модель под любую нужду
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 20:19
Цитата Сообщение от xellan24rus Посмотреть сообщение
2 Вывод информации о людях, только вывод.
3 вывод продуктов\описание, функционал: редактирование, удаление, добавление.
Если просто два независимых списка, то нужно только добавить таблицу в БД и репозиторий для товаров.

Добавлено через 2 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
В данном примере сохранение любого имени и если есть запись в бд, тогда авторизован.
После сохранения же - есть любая запись.
Тогда получается, сохранение нового имени. И после этого считать что авторизованный вход произошёл.
Будем делать это как изменение состояния Модели?
Тогда нужно в Модель добавить метод авторизации, свойство возвращающее состояние авторизации, и событие об изменении свойства авторизации.

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
Если углубиться, то это удобная реализация. Связь между данными ничем не ограничена, можно создать модель под любую нужду
Если нужно обеспечить безопасность (независимость) разработки, то надо на каждом уровне делать разные типы сущности.
Использование мутабельных ссылочных типов в качестве DTO для обмена между несвязанными (разработкой) типами создаёт риски "нечаянно что-то поломать".
Поэтому для DTO лучше использовать либо значимые типы, либо иммутабельные DTO.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 21:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если просто два независимых списка, то нужно только добавить таблицу в БД и репозиторий для товаров.
Так уже сделано, два не зависимых списка. И команды для них. Завтра перепишу на ваш пример.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
После сохранения же - есть любая запись.
Тогда получается, сохранение нового имени. И после этого считать что авторизованный вход произошёл.
Будем делать это как изменение состояния Модели?
Тогда нужно в Модель добавить метод авторизации, свойство возвращающее состояние авторизации, и событие об изменении свойства авторизации.
Да любая запись сохраняется, любое имя для примера. Сейчас сделано так при первом входе нужно ввести имя, далее проверяется есть ли запись, если есть, то окно авторизации никогда не показывается.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если нужно обеспечить безопасность (независимость) разработки, то надо на каждом уровне делать разные типы сущности.
Использование мутабельных ссылочных типов в качестве DTO для обмена между несвязанными (разработкой) типами создаёт риски "нечаянно что-то поломать".
Поэтому для DTO лучше использовать либо значимые типы, либо иммутабельные DTO.
Но если модели и разные все, то зависимость их идёт при инициализации массивов, ссылок на коллекции и по шаблону один ко многим, где 1 модель и 3-5 ссылок на коллекции, даже если внутри них есть есть подобное. То тут поломать можно только если нет понимания самой модели. К примеру реферальная система многоуровневая, лучшим вариантом будет сделать у пользователя массив на эти уровни и если есть под уровни, то сделать их. Тем самым при можно сразу работать в рамках одного объекта со всеми данными, что упрощает задачу. Не жели делить таблицу на части и вместо одного вызова делать к примеру 5 чтобы получить эти объекты. Думаю тут скорее всего зависит от задачи и нужно правильно выбирать как реализовать.

Добавлено через 1 минуту
Да и бд какие то поддерживают значения для сущностей null, то есть если не нужно, то с этим можно не работать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 23:06
Цитата Сообщение от xellan24rus Посмотреть сообщение
если есть, то окно авторизации никогда не показывается.
То есть нужно при запуске проверять есть ли имя пользователя в БД.
И таблица в БД будет всего из одной строки.
Верно?

Цитата Сообщение от xellan24rus Посмотреть сообщение
Думаю тут скорее всего зависит от задачи и нужно правильно выбирать как реализовать.
От задачи, от одиночная vs коллективная разработка, планируется поддержка, модернизация, кто ими будет заниматься и т.д.
Вообще, надо понимать, что основные плюсы ООП получают коллективы разработчиков приложений с длительным сроком поддержки и постоянной модернизацией.
Разработчик одиночка небольшого приложения которое нужно отдать заказчику и забыть про него, скорее всего олт идеального следования ООП только дополнительную работу сам себе создаст.

Но в данном случае, у нас учебный пример. Поэтому будем на нём изучать разные способы реализации и по возможности с наименьшими нарушениями ООП. Это позволит вам потом осознано принимать решения где нужно "сделать по феншую", а где можно "срезать углы".
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 23:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть нужно при запуске проверять есть ли имя пользователя в БД.
И таблица в БД будет всего из одной строки.
Верно?
Получается так, но можно изменить хранение на txt, xml, json. Для такой задачи особо мало смысла что то изобретать.
Элд Хасп, в рамках командной работы и одиночной большая разница. Но скорее всего важный фактор несет масштабность проекта. Ведь в малом проекте где будет 10 классов, дробить логику и т.п. Будет лишней работой, особенно если это заказ про который забудешь. А другое дело более большой проект с обслуживанием, обновлением. Тут уже уже лучше соблюдать архитектуру, ведь от нее будет зависеть насколько легко будет обслуживание. Достаточно будет исправить один метод или десяток к примеру.
В целом архитектуру можно сравнивать со стилями. Можно писать в каждом свойстве значение, а можно создать ресурс и использовать в рамках даже не одного приложения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
11.02.2024, 23:46
xellan24rus, добавил авторизацию в Модель

Добавлено через 1 минуту
Цитата Сообщение от xellan24rus Посмотреть сообщение
в рамках командной работы и одиночной большая разница.
Я об этом же и написал.

Добавлено через 1 минуту
Цитата Сообщение от xellan24rus Посмотреть сообщение
Ведь в малом проекте где будет 10 классов, дробить логику и т.п. Будет лишней работой, особенно если это заказ про который забудешь.
Да. Но выбор должен осознанный, а не потому что "по другому не умею".
Поэтому нужно изучать как сделать "правильно". Хотя это и более объёмно.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
11.02.2024, 23:51  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Да. Но выбор должен осознанный, а не потому что "по другому не умею".
Поэтому нужно изучать как сделать "правильно". Хотя это и более объёмно.
Верно, но в плане архитектуры, декомпозиции понимание приходит только на больших\объемных проектах.
Если постоянно делать мелкие\средние проекты то хватит декомпозиции. А если проект без обновлений, то зависит уже
"по другому не умею".
для некоторых, для кого то лень. Кому то вовсе качество не важно, не мало таких...
Видел и полностью синхронные решения в многопоточной работе Task...
Поэтому соглашусь, осознанный выбор лучшее решение)
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
12.02.2024, 08:10
Цитата Сообщение от Элд Хасп Посмотреть сообщение
xellan24rus, добавил авторизацию в Модель
А нужен ли тогда в интерфейсе Модели репозиторий юзеров?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2024, 08:10

Структура WPF приложения на MVVM
Здравствуйте. Разрабатываю приложение на WPF. Использую шаблон MVVM. В представлении контент сгруппирован по вкладкам TabControl. ...

Пример реализации WPF+MVVM приложения
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Пример решения ТЗ по теме...

Паттерн MVVM или как писать приложения на WPF
Собтвенно вопрос в заголовке. По-скольку WPF поддерживает привязку различным образом наверно это нужно как-то использовать, а не просто как...

Kivy для создания простого приложения
Всем привет ,я делаю простую программу на python, но никак не могу решить 2 проблемы. 1) Никак не меняется фон ModalView, хотя уже все...

Пример переключения между окнами WPF MVVM
Здравствуйте. Изучаю как можно переходить между окнами в wpf в рамках MVVM. Изучаю данный пример: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru