Ninject: 构造所有继承自抽象 class 的 classes,也传递一些自定义布尔逻辑

Ninject: Construct all classes that inherit from an abstract class that also pass some custom Boolean logic

我正在寻找如何使用 Ninject 获取所有继承自基础 class 且也通过一些自定义布尔条件的实例。这是 的延续。这就是我为所有继承自 MyAbstractClass 的 classes 创建 binging 的方式。

_kernel.Bind(x => { x
    .FromThisAssembly()
    .SelectAllClasses()
    .InheritedFrom<MyAbstractClass>()
    .BindAllBaseClasses()
    .Configure(syntax => syntax.InSingletonScope());
});

如果我的语法正确,这将为所有继承自 MyAbstractClass 的 classes 创建一个单例范围绑定。接下来我需要 get/construct 所有 classes.

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>();

上面的代码将 get/create 所有 class 继承自 MyAbstractClass 的类。

现在我需要在此过程中再添加一个步骤。基于“访问角色”,并非所有继承自 MyAbstractClass 的 class 都应创建,因为当前用户可能无法访问每个派生 class 的功能。所以我尝试向每个派生的 class 添加一个 CanLoad 布尔值并尝试以下操作。

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>().Where(x => x.CanLoad == true);

虽然项目只包含我预期的 classes,但根据我的 CanLoad 逻辑,我确实看到每个派生 class 的构造函数被调用,因为 kernel.GetAll( ) 方法。此外,它还必须创建 class 来调用其 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 继承的 class 并且对于 CanLoad 布尔方法也 return 为真?我一直在尝试使用 Ninject 和 Linq,可能还有 Reflection,但我还没有找到解决方案。

编辑:

为了详细说明“权限逻辑”,我们的应用程序一开始就调用 Web 服务来获取 LDAP groups/roles 的列表,这些列表被 return 编辑为一个简单的列表细绳。每个派生的 classes 实际上都是 ViewModel,并且每个 ViewModel“需要”一个最小角色才能让当前用户使用其功能。我想我可以将 Ninject/binding/get 逻辑与一些自定义“权限逻辑”联系起来,并且只有 bind/get class 当前用户可以访问。 VM 列表成为停靠控件的 ItemsSource 绑定(我们正在考虑使用为 Ribbon 控件创建 ItemsSource 绑定)。在这一点上都是研究。

向绑定添加 When 约束:

.Configure(syntax => syntax
    .When(... check permission here...)
    .InSingletonScope());

由于您没有说明您如何知道用户是否具有权限的逻辑,因此我无法在此处提供更具体的信息。但一般来说,只要你想确保它不能也不会被实例化,除非满足条件,你应该在你的绑定中添加一个 'When' 约束。