如何在ject中更改现有绑定的作用域

本文关键字:绑定 作用域 ject | 更新日期: 2023-09-27 18:11:52

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

如何在ject中更改现有绑定的作用域

这个场景没有被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()));

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