我希望了解如何使用Ninject来获取从基类继承的所有实例,这些实例也传递一些自定义布尔条件。这是previous question的延续。这就是我为从MyAbstractClass继承的所有类创建一个binging的方法。
_kernel.Bind(x => { x
.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<MyAbstractClass>()
.BindAllBaseClasses()
.Configure(syntax => syntax.InSingletonScope());
});
如果我的语法正确,这将为从MyAbstractClass继承的所有类创建单例范围绑定。接下来我需要获取/构建所有类。
IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>();
上面的代码将获取/创建从MyAbstractClass继承的所有类。
现在我需要在此过程中再添加一个步骤。基于“访问角色”,不应创建从MyAbstractClass继承的所有类,因为当前用户可能无法访问每个派生类的功能。所以我尝试在每个派生类中添加一个CanLoad布尔值并尝试以下内容。
IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>().Where(x => x.CanLoad == true);
虽然项目确实只包含我期望的类,但基于我的CanLoad逻辑,我确实看到了因为kernel.GetAll()方法而被调用的每个派生类的构造函数。此外,它必须创建类来调用其CanLoad方法,因此无法工作。我还想过让CanLoad变得静态。我还想过一个类似于下面的方法。
public bool CanLoad<T>() where T : MyAbstractClass {
//return true if the current user has the correct access roles to create class of type T
}
所以我的问题是我如何使用Ninject GetAll()方法来获取从MyAbstractClass继承的所有类,这些类也为CanLoad Boolean方法返回true?我一直在尝试使用Ninject和Linq以及可能的Reflection,但我还没有解决方案。
修改:
要详细说明“权限逻辑”,我们的应用程序最初会调用Web服务来获取LDAP组/角色列表,这些列表/角色将作为简单的字符串列表返回。每个派生类实际上都是ViewModel,每个ViewModel“需要”最小的角色,使其功能可供当前用户使用。我以为我可以将Ninject / binding / get逻辑与一些自定义的“权限逻辑”绑定,并且只绑定/获取当前用户可以访问的类。 VM列表成为对接控件的ItemsSource绑定(我们正在考虑使用为Ribbon控件创建ItemsSource绑定)。这是所有研究。
答案 0 :(得分:1)
为绑定添加When
约束:
.Configure(syntax => syntax
.When(... check permission here...)
.InSingletonScope());
由于您没有说明逻辑如何知道用户是否有权限,因此我无法在此提供更具体的信息。但一般来说,除非满足条件,否则每当要确保它不能并且不会实例化时,应该为绑定添加“When”约束。