2011-11-05 70 views
2

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

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

在另一方面,我有一个FormServices模块应该添加一个项目注入PermissionManagerContainer。我认为代码必须是这样的:因此,在一个名为ManagePermissions.aspx页面

public class FormServicesModule : NinjectModule 
{ 
    [Ninject.Inject] 
    private IPermissionManagerContainer permissionManagerContainer { get; set; } 

    public override void Load() 
    { 
     permissionManagerContainer.RegisterManager(formServicesPermissionManager); 
    } 
} 

,我再次注入PermissionManagerContainer,创造所有模块的权限管理用户界面。例如,我需要在我的FormServices模块中保护表单,并为该服务中的每个表单定义权限。

但我认为在将它注入另一个模块之前不能保证绑定PermissionManagerContainer

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

但我的问题是:

  1. 不Ninject内部或不具有这个功能吗?
  2. Ninject很可能在内部管理这种情况,我可以在加载方法中调用RegisterManager。这是真的吗?

回答

1

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

+0

其实我试图用Ninject来创建类似Composite Web Application Block的东西。我用我自己的解决方案,它适合我。你为什么说它滥用模块?你能否给我提供一些文件来阅读它? – alisabzevari

+0

你说得对。但我同意你的[Ninject.Inject]部分。我使用Kernel.Get来获取服务实例,并使用Load之外的方法调用它(我必须确保PermissionManagerContainer绑定到Ninject)。 – alisabzevari