我正在使用Ninject进行DI。我有Ninject Modules将一些服务绑定到内核,并将其他模块中的绑定对象用作服务。
为了清除这种情况,让我们看看一些代码:
这是我的安全模块。它提供名为PermissionManagerContainer
的服务。
public class SecurityModule : NinjectModule
{
public override void Load()
{
Bind<IPermissionManagerContainer>().To<PermissionManagerContainer>().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
注入另一个模块之前无法保证绑定RegisterManager
!
实际上,我有自己的解决方案来解决这个问题。我可以编写一个名为MyModule的抽象类,它是从NinjectModule中分类的,并编写一个名为InitializeModule的抽象方法。并在该方法中调用RegisterManager
。然后在加载内核中的所有模块后,为每个加载的模块调用InitializeModule。
但我的问题是:
答案 0 :(得分:1)
你误解了模块的用途。他们在那里配置Ninject。他们自己不应该有任何依赖。 RegisterManager属于应用程序的服务或启动操作中的某个位置。或者可能您必须更改权限管理器的工作方式,以便它可以使用所有已配置的管理器的可枚举,而不是注册它们。但是几乎不可能从这个问题中分辨出什么是最好的 - 只是你正在滥用模块来寻找他们不想要的东西。