Я разрабатываю модульное приложение WPF, и мне любопытно, есть ли возможность контролировать экспорт модулей с правами пользователя? У меня есть 2 пользователя, которые используют приложение с 3 модулями, каждый пользователь имеет права видеть или не видеть эти модули, f.ex. 1. Пользователь имеет право видеть только первые 2 модуля, а второй имеет право видеть только 1. и 3. модуль. Права хранятся в базе данных и загружаются в процессе синхронизации и сохраняются в файле конфигурации xml (я думаю, что с этим проблем нет). Модули экспортируются как: [Export(typeof(MyBestViewModule))]
в каждом модульном проекте. Или, может быть, есть какой-то другой способ контролировать эти модули по правам пользователей? Лучшие практики или что-то лучше, может быть, кто-то уже сделал это, чтобы поделиться опытом и идеей, потому что я не в этом.Экспорт модуля управления в WPF по правам пользователя
ответ
Предполагая, что вы используете MEF, есть способ фильтрации с помощью модулей FilteredCatalog
:
public class ViewModulesCatalog : FilteredCatalog
{
public ViewModulesCatalog(ComposablePartCatalog inner, IPermissionsProvider permissionsProvider)
: base(inner, part => part.ExportDefinitions.All(def => permissionsProvider.IsAllowed(def)))
}
где IPermissionsProvider
является контрактом вашей таможенной службы, которая проверяет права доступа текущего пользователя. Что-то вроде этого:
public interface IPermissionsProvider
{
bool IsAllowed(ExportDefinition def);
}
Update.
Если вы используете Prism + MefBootstrapper
, вы переопределены метод ConfigureAggregateCatalog
:
// suppose assemblies with modules are located in "modules" subdir
var directoryCatalog = new DirectoryCatalog(@".\modules");
// let's filter directoryCatalog to get allowed modules
var permissionsProvider = // ... obtain provider reference here
var modulesCatalog = new ViewModulesCatalog(directoryCatalog, permissionsProvider);
return new AggregateCatalog(modulesCatalog);
жаль, что я не совсем понимаю, где разместить это в моем основном проекте. – John
Где-то есть место, где вы строите каталоги MEF. Вам нужно создать каталог из своих модулей, отфильтровать его и после этого добавить в контейнер MEF. – Dennis
Я использую MefBootstrapper ... К настоящему времени у меня есть класс Bootstrapper, который переопределил метод ConfigureAggregateCatalog(), и он выбирает все модули из пути проекта в AggregateCatalog (возможно, вы имели в виду это) – John
Это не звучит как проблема WPF, но что-то еще, чтобы сделать с рамкой/IoC внедрения зависимости - Единство/MEF или что-то вроде Призма. Не совсем понятно, что вы используете. –