这是我对这个问题的解决方案,我花了一段时间才成功做到这一点。
我尝试覆盖内部权限管理器,但它是隐藏的,无法覆盖它,所以唯一的方法是使用“温莎处理程序选择器”来强制使用我的 PermissionManager
1) 转到 BoilerPlate 并将此文件(PermissionDefinitionContextBase、PermissionDictionary、PermissionManager)复制到您的项目中。
2) 在 PreInitialize() 的核心模块中,在开头添加此行:
//Added this Handler so i can redirect every IPermissionManager to my Custom Implementation
IocManager.IocContainer.Kernel.AddHandlerSelector(new PermissionManagerHandler());
3) 定义 PermissionManagerHandler
public class PermissionManagerHandler : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
return typeof(IPermissionManager) == service;
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return handlers.First(x => x.ComponentModel.Implementation == typeof(PermissionManager));
}
}
4) 在核心模块PostInitilize()方法中添加
IocManager.Resolve<PermissionManager>().Initialize();
5)在自定义权限管理器中,我通过添加
修改了初始化功能Permissions.Clear();
6)每次我添加新的权限时,我都会调用初始化函数,这样我就可以使用命令重新发布所有内容:
IocManager.Resolve<PermissionManager>().Initialize();
只需更改第 1 号中复制的文件的名称,然后更改命名空间,就像 @AhmedGhorab 所说的那样。
在处理程序中引用新名称类
public IHandler SelectHandler(string key, Type service, IHandler[] handlers) {
if (handlers.Any(x => x.ComponentModel.Implementation == typeof(ProdPermissionManager)) )
{
return handlers.First(x => x.ComponentModel.Implementation == typeof(ProdPermissionManager));
}
else
return null; }