2015-11-02 69 views
0

我正在開發一個基於模塊的WPF應用程序,我很好奇如果有一個選項來控制具有用戶權限的模塊導出? 我有2個用戶使用3個模塊的應用程序,每個用戶有權查看或不查看這些模塊,f.ex. 1.用戶有權僅查看前兩個模塊,而第二個用戶有權僅查看1.和3.模塊。 權限存儲在數據庫中,並在同步過程中下載並存儲在xml配置文件中(我認爲這沒有問題)。 模塊在每個模塊項目中輸出爲:[Export(typeof(MyBestViewModule))]。 或者也許有一些其他的方式來控制這些模塊的用戶權限?最好的實踐或更好的東西,也許有人已經做了,可以分享經驗和想法,因爲我沒有。通過用戶權限在WPF中控制模塊導出

+0

這聽起來不像一個WPF的問題,但更多的東西做與IOC/DependencyInjection架構 - 統一/ 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); 
} 

更新

如果您使用棱鏡+ 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 ... 現在我已經引導程序類已overrided ConfigureAggregateCatalog()方法,並選擇從項目路徑中的所有模塊到AggregateCatalog(可能是您意味着) – John