Ninject 工厂扩展 vs. 懒惰<T>



我正在尝试注入一个懒惰计算的参数:

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>();

相关内容

  • 没有找到相关文章

最新更新