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