c# - 如何将对象注入(inject) Ninject 模块

标签 c# ninject

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

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

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

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

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

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

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

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

但我的问题是:

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

最佳答案

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

关于c# - 如何将对象注入(inject) Ninject 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022062/

相关文章:

C#:运行进程然后使用按钮终止它

asp.net-web-api - Ninject.ActivationException 仅在第一个 Web 请求时抛出(WebAPI 2、OWIN 3、Ninject 3)

c# - Ninject.MVC3。 Bootstrapper.Initialize 抛出 "Sequence contains no elements"

dependency-injection - MVC3 EF 工作单元 + 通用存储库 + Ninject

c# - 如何从 C# 将结构作为 C dll 中的指针传递

c# - 3层架构问题

c# - 对象的内存缓存

c# - 将2个不同类型的单独列表合并为1个其他类型的新列表

c# - 如何使用 Ninject 将拦截器添加到特定方法

c# - 使用 NUnit 在不同的应用程序域中运行单元测试