加载Ninject模块后设置所有绑定的范围

时间:2015-03-12 01:33:53

标签: c# dependency-injection ninject inversion-of-control

我想通过将它们分成Ninject模块来组织我的Ninject绑定。但是,我有多个应用程序将使用这些模块。其中一个是ASP.Net MVC应用程序,另一个是控制台应用程序,另一个是Windows服务等等。在MVC应用程序中,我想使用InRequestScope范围绑定,但在另一个应用程序中(引用我的核心程序集,其中Ninject模块位于其中)我想使用不同的范围绑定。这可能吗?

随着我的基础架构的增长以及我所有绑定的注册变得非常庞大和冗长,我最终在几个不同的组合根中重复这些绑定 - 它们之间的唯一区别是每个绑定的生命周期范围。我真的很想让这更干。

理想的是以下(伪代码):

多个应用引用的核心程序集

public class MyModule : NinjectModule {
    public override Load(){
        Kernel.Bind<IMyType>().To<MyType>();
    }
}

在MVC应用程序中

kernel.Load(new MyModule())
    .Configure(p => p.UseInRequestScope);

在另一个应用程序中

kernel.Load(new MyModule())
    .Configure(p => p.UseInTransientScope);

1 个答案:

答案 0 :(得分:0)

composition root用于撰写应用。通过扩展,如果您有多个应用程序,则应该具有尽可能多的组合根。

它们是not meant for reuse,因为这会将应用程序紧密耦合在一起。正如帖子所指出的那样:

  

尝试重用组合根比尝试“重用”应用程序没有意义。

所以简短的回答是每个应用程序使用一个组合根,然后你可以按照你想要的方式确定每个应用程序的关系范围。通过组合应用程序的组合根,您创建(至少)一个人为问题,如果您只是将它们分开则不存在。