如何在ject中更改现有绑定的作用域
本文关键字:绑定 作用域 ject | 更新日期: 2023-09-27 18:11:52
在一个模块中,我为一个对象设置了绑定。另外还有两个模块:测试模块和web模块。web模块希望绑定在请求范围内,而测试模块希望绑定在单例范围内。现在,我们只是复制整个绑定并添加适当的作用域。有更好的方法吗?我正在寻找一种方法,我可以使绑定本身(这是一个tommethod绑定)在一个模块,然后只是有测试和web模块只是改变绑定的范围。
这个场景没有被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()
)。