我正在尝试使用Ninject 3基于约定的绑定,并希望指定服务应该在绑定时绑定哪种生活方式。
我正在尝试使用下面的代码,但没有成功;我的应用程序错误说我的服务没有受到约束。我知道我可以编写自己的活页夹并自己完成所有的反射工作,但这看起来相当不错。我错过了什么吗?
Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
.SelectAllClasses()
.BindDefaultInterface()
.Configure(cfg =>
{
cfg.InTransientScope();
cfg.WhenClassHas<BindAsASingletonAttribute>().InSingletonScope();
cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();
}));
谢谢,
乔恩
答案 0 :(得分:1)
在Configure
回调中,您正在组合一个用于所有绑定的配置,当您编写多个WhenClassHas
和In...Scope
语句时,您基本上会覆盖自己的设置,所以类型绑定将使用最后一个语句cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();
。
要解决这个问题,你需要使用Configure
的第二个重载来获取当前绑定的类型,并根据其属性在正确的范围内注册你的类型:
using Ninject.Infrastructure.Language; //needed for HasAttribute<T>
//...
Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
.SelectAllClasses()
.BindDefaultInterface()
.Configure((cfg, type) =>
{
if (type.HasAttribute<BindAsASingletonAttribute>())
cfg.InSingletonScope();
else if (type.HasAttribute<BindInRequestScopeAttribute>())
cfg.InRequestScope();
else
cfg.InTransientScope();
}));