如何将对象注入Ninject模块

我正在使用Ninject进行DI。 我有Ninject Modules将一些服务绑定到内核并在其他模块中使用绑定对象作为服务。 为了清除这种情况,让我们看一些代码:这是我的安全模块。 它提供名为PermissionManagerContainer的服务。

 public class SecurityModule : NinjectModule { public override void Load() { Bind().To().InSingletonScope(); } } 

另一方面,我有一个FormServices模块,它应该向注入的PermissionManagerContainer添加一个项目。 我认为代码必须是这样的:

 public class FormServicesModule : NinjectModule { [Ninject.Inject] private IPermissionManagerContainer permissionManagerContainer { get; set; } public override void Load() { permissionManagerContainer.RegisterManager(formServicesPermissionManager); } } 

因此,在名为ManagePermissions.aspx的页面中,我再次注入PermissionManagerContainer并为所有模块的权限管理器创建用户界面。 例如,我需要在FormServices模块中保护Forms,并为该服务中的每个表单定义权限。

但我认为在将其注入另一个模块之前,无法保证绑定PermissionManagerContainer

实际上,我有自己的解决方案来解决这个问题。 我可以编写一个名为MyModule的抽象类,它是NinjectModule的子类,并编写一个名为InitializeModule的抽象方法。 并在该方法中调用RegisterManager 。 然后在加载内核中的所有模块后,为每个加载的模块调用InitializeModule。

但我的问题是:

  1. Ninject内部是否具有此function?
  2. Ninject很可能在内部管理这个案例,我可以在load方法中调用RegisterManager 。 这是真的吗?

你误解了模块的用途。 他们在那里配置Ninject。 他们自己根本不应该有任何依赖。 RegisterManager属于应用程序的服务或启动操作中的某个位置。 或者您可能必须更改权限管理器的工作方式,以便它可以使用所有已配置的管理器的可枚举,而不是注册它们。 但是几乎不可能从这个问题中分辨出什么是最好的 – 只是你正在滥用模块来寻找他们不想要的东西。