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

C# 如何更改Ninject中现有绑定的范围,c#,scope,ninject,C#,Scope,Ninject,在一个模块中,我为一个对象设置了一个绑定。还有另外两个模块:测试模块和web模块。web模块希望该绑定位于请求范围内,而测试模块希望该绑定位于单例范围内。现在,我们只是复制整个绑定并添加适当的范围。有更好的方法吗?我正在寻找一种方法,我可以在一个模块中创建绑定本身(这是一个ToMethod绑定),然后让测试和web模块更改该绑定的作用域。使用Ninject,只需使用Bind().ToSelf()-然后添加您想要的任何作用域(Bind().ToSelf().InRequestScope()),例如

在一个模块中,我为一个对象设置了一个绑定。还有另外两个模块:测试模块和web模块。web模块希望该绑定位于请求范围内,而测试模块希望该绑定位于单例范围内。现在,我们只是复制整个绑定并添加适当的范围。有更好的方法吗?我正在寻找一种方法,我可以在一个模块中创建绑定本身(这是一个ToMethod绑定),然后让测试和web模块更改该绑定的作用域。

使用Ninject,只需使用
Bind().ToSelf()
-然后添加您想要的任何作用域(
Bind().ToSelf().InRequestScope())
,例如)。

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));
    }
}

编辑:这只适用于具体类型-如果绑定的是抽象类型,那么ToSelf()方法将不起作用。
IKernel.Load(new ConfigurableScopeBindingModule(x => x.InSingletonScope()));