Ninject Factory扩展与Lazy <t> </t>

时间:2013-11-08 20:39:11

标签: c# ninject ninject-extensions

我正在尝试注入一个懒惰评估的参数:

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的自动工厂我只是没想到。

1 个答案:

答案 0 :(得分:0)

如果您不想使用工厂,我同意工厂不完全适用于此用例。相反,您可以使用提供商为您提供令牌。

public class MyIdentityProvider : Provider<IIdentifier>
{
    ...
}

kernel.Bind<IIdentifier>().ToProvider<MyIdentityProvider>();