如何在Ninject中更改现有绑定的范围

时间:2014-07-07 14:32:32

标签: c# scope ninject

在一个模块中,我为对象设置了绑定。还有另外两个模块:测试模块和Web模块。 Web模块希望该绑定在请求范围内,并且测试模块希望该绑定在单一范围内。现在,我们只是复制整个绑定并添加适当的范围。有一个更好的方法吗?我正在寻找一种方法,我可以在一个模块中进行绑定(它是一个ToMethod绑定),然后让测试和Web模块只更改该绑定的范围。

2 个答案:

答案 0 :(得分:1)

ninject并不特别支持此方案,并且很可能也不是任何其他IoC。 特别是范围,但也可能有其他事情,如上下文参数和解决某些类型和配置的方式,是通常依赖于应用程序/组合根。

但是,如果您愿意,当然可以利用“正常”编程原则来减轻负担。但我不会真的推荐它,因为虽然你可以使范围容易配置,但它会使其他事情更复杂,更难维护。例如:

public class ConfigurableScopeBindingModule : NinjectModule
{
    private readonly Action<IBindingInSyntax<object>> scopeConfigurator;

    public ConfigurableScopeBindingModule(Action<IBindingInSyntax<object>> scopeConfigurator)
    {
        this.scopeConfigurator = scopeConfigurator;
    }

    public override void Load()
    {
        this.BindAndApplyScoping(x => x.Bind(typeof(string)).ToSelf());
    }

    private void BindAndApplyScoping(Func<IBindingRoot, IBindingInSyntax<object>> binding)
    {
        this.scopeConfigurator(binding(this));
    }
}

并使用如:

IKernel.Load(new ConfigurableScopeBindingModule(x => x.InSingletonScope()));

答案 1 :(得分:0)

使用Ninject,只需使用Bind<T>().ToSelf() - 然后添加您想要的任何范围(例如Bind<T>().ToSelf().InRequestScope())。