我正在尝试注入一个懒惰评估的参数:
private readonly Lazy<IIdentifier> _userIdentifier;
public DocumentController(Lazy<IIdentifier> userIdentifier)
{
_userIdentifier = userIdentifier;
}
userIdentifier
创建起来并不昂贵,但这是一个WebApi应用程序,而userIdentifier
是从另一个依赖于HTTPContext
的对象中提取的,App_Start
在{{1}处为空} 时间。必须在控制器构造函数中指定Lazy
似乎是代码味道,因为控制器不需要知道或关心此参数在组合时需要特殊处理。
它是这样注入的:
kernel.Bind<IIdentifier>()
.ToMethod(x => kernel.Get<IMinimalSecurityToken>().UserID);
在这种情况下,我认为我不能使用Ninject Factory扩展,因为它不像新建对象实例那么简单。我宁愿不写工厂只是为了处理这种情况,虽然我认为将Lazy
粘贴到控制器中会更好,所以我希望有一些方法可以使用Ninject的自动工厂我只是没想到。
答案 0 :(得分:0)
如果您不想使用工厂,我同意工厂不完全适用于此用例。相反,您可以使用提供商为您提供令牌。
public class MyIdentityProvider : Provider<IIdentifier>
{
...
}
kernel.Bind<IIdentifier>().ToProvider<MyIdentityProvider>();