2015-11-02 4 views
0

Я разрабатываю модульное приложение WPF, и мне любопытно, есть ли возможность контролировать экспорт модулей с правами пользователя? У меня есть 2 пользователя, которые используют приложение с 3 модулями, каждый пользователь имеет права видеть или не видеть эти модули, f.ex. 1. Пользователь имеет право видеть только первые 2 модуля, а второй имеет право видеть только 1. и 3. модуль. Права хранятся в базе данных и загружаются в процессе синхронизации и сохраняются в файле конфигурации xml (я думаю, что с этим проблем нет). Модули экспортируются как: [Export(typeof(MyBestViewModule))] в каждом модульном проекте. Или, может быть, есть какой-то другой способ контролировать эти модули по правам пользователей? Лучшие практики или что-то лучше, может быть, кто-то уже сделал это, чтобы поделиться опытом и идеей, потому что я не в этом.Экспорт модуля управления в WPF по правам пользователя

+0

Это не звучит как проблема WPF, но что-то еще, чтобы сделать с рамкой/IoC внедрения зависимости - Единство/MEF или что-то вроде Призма. Не совсем понятно, что вы используете. –

ответ

0

Предполагая, что вы используете 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); 
+0

жаль, что я не совсем понимаю, где разместить это в моем основном проекте. – John

+0

Где-то есть место, где вы строите каталоги MEF. Вам нужно создать каталог из своих модулей, отфильтровать его и после этого добавить в контейнер MEF. – Dennis

+0

Я использую MefBootstrapper ... К настоящему времени у меня есть класс Bootstrapper, который переопределил метод ConfigureAggregateCatalog(), и он выбирает все модули из пути проекта в AggregateCatalog (возможно, вы имели в виду это) – John