控制模块按用户权限导出WPF

时间:2015-11-02 10:25:59

标签: c# wpf mef

我正在开发一个基于模块的WPF应用程序,我很好奇是否有控制模块导出和用户权限的选项? 我有2个用户使用带有3个模块的应用程序,每个用户都有权查看或不查看这些模块,f.ex。 1.用户有权只查看前2个模块,第二个模块只有权查看1.和3.模块。 权限存储在数据库中并在同步过程中下载并存储在xml配置文件中(我认为没有问题)。 模块在每个模块项目中导出如:[Export(typeof(MyBestViewModule))]。 或者也许还有其他方法可以通过用户权限来控制这些模块?最好的做法或更好的事情,也许有人已经做过,可以分享经验和想法,因为我已经不在了。

1 个答案:

答案 0 :(得分: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);
}

<强>更新

如果您使用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);