• Какие плюсы и минусы у различных подходов в работе с диалоговыми окнами в WPF MVVM?

    @Sterk
    Программист
    С чего вы взяли что это подходы для работы с диалогами?
    Messenger - паттерн для передачи сообщений(событий) из одной вью модели в другую.
    Service Dialog - сервис который создает разные диалоговые окна?
    Dependency Injection - одна из реализаций принципа Inversion of Control (инверсия управления). Например вашей MainViewModel надо использовать Messenger и ServiceDialog. Тогда вы делаете инъекцию зависимостей, например, через конструктор.
    public MainViewModel(Messenger messenger, ServiceDialog serviceDialog){...}

    IoC-контейнер подставит зависимости сам.
    Так я определяю сказанные вами понятия. Теперь вопрос - что мешает использовать это все вместе?
    Ответ написан
    3 комментария
  • Что почитать о том, как создать многопользовательскую программу WPF C#?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Поделюсь прямо готовым примером

    1) Надо как то хранить в БД права пользователя
    Вводим понятие "роль" - это некое тривиальное право доступа к конкретному разделу (например user_view, user_edit, user_delete).
    CREATE TABLE `role` (
     `role_title` varchar(255) NOT NULL COMMENT 'Роль',
     `role_title_description` text NOT NULL COMMENT 'Описание роли',
     PRIMARY KEY (`role_title`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Роли пользователей';

    Роли объединяются в группы (администраторы, модераторы, итд)
    CREATE TABLE `group` ( 
     `group_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID группы', 
     `name` text NOT NULL COMMENT 'Имя группы',  
      PRIMARY KEY (`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Группы пользователей';
    
    CREATE TABLE `xref_group_role` (  
    `group_id` int(11) NOT NULL,  
    `role_title` varchar(255) NOT NULL,  
    PRIMARY KEY (`group_id`,`role_title`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Связь групп и ролей';

    Ну и пользователи привязаны к группам
    CREATE TABLE `xref_user_group` (  
    `user_id` int(11) NOT NULL,  
    `group_id` int(11) NOT NULL,  
    PRIMARY KEY (`group_id`,`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Связь пользователей и групп'


    2) Когда пользователь авторизуется - получаем список его ролей
    SELECT 
    	distinct `role`.`role_title`
    FROM 
    	`xref_user_group`
    JOIN `xref_group_role`
    	ON `xref_user_group`.`group_id` = `xref_group_role`.`group_id`
    JOIN `role`
    	ON `xref_group_role`.`role_title` = `role`.`role_title`
    WHERE
    	`xref_user_group`.`user_id` = 123


    3) В рамках данного примера подразумевается что все роли исключительно "разрешительные". Если у пользователя есть роль - он может совершать соответствующее действие. Нет - не может.
    Соответственно в логике приложения, когда пользователь пытается совершить какое то действие - просто проверяем наличие у него роли.

    Фуф)

    UPD
    Спасибо, большое!
    Только не совсем понятно как это должно взаимодействовать например с меню. Например есть меню Правка -> Добавить, Изменить, Удалить. Если у пользователя есть права на добавление и изменение но нет на удаление, как сделать что бы пункт меню "Удалить" был не активен?

    Я под десктоп последний раз кодил лет 12 назад на Visual Basic (еще не .net) , но тем не менее:
    У вас должен быть код который создает это меню. В этот код вставляем все проверки ролей.
    Если кода меню нет (вы собрали меню через конструктор), то нужно написать код который выполняется скажем при загрузке формы, смотрит на роли текущего пользователя и соответственно включает/выключает пункты меню.
    Ответ написан
    Комментировать