我正在尝试注入一个懒惰计算的参数:
private readonly Lazy<IIdentifier> _userIdentifier;
public DocumentController(Lazy<IIdentifier> userIdentifier)
{
_userIdentifier = userIdentifier;
}
userIdentifier
的创建成本并不高,但这是一个 WebApi 应用程序,userIdentifier
是从依赖于 HTTPContext
的另一个对象中提取的,该对象App_Start
时为 null。必须在控制器构造函数中指定Lazy
似乎是一种代码异味,因为控制器不需要知道或关心此参数在组合时需要特殊处理。
它是像这样注入的:
kernel.Bind<IIdentifier>()
.ToMethod(x => kernel.Get<IMinimalSecurityToken>().UserID);
我认为在这种情况下我不能使用 Ninject Factory 扩展,因为它并不像更新对象的实例那么简单。我宁愿不写一个工厂来处理这种情况,尽管我想这比将Lazy
插入控制器更可取,所以我希望有某种方法可以使用 Ninject 的自动工厂,我只是没有想到。
如果您不想使用工厂并且我同意工厂不太适合这里的用例。相反,您可以使用提供程序为您提供令牌。
public class MyIdentityProvider : Provider<IIdentifier>
{
...
}
kernel.Bind<IIdentifier>().ToProvider<MyIdentityProvider>();