2

我正在尝试注入一个延迟评估的参数:

private readonly Lazy<IIdentifier> _userIdentifier;

public DocumentController(Lazy<IIdentifier> userIdentifier)
{
    _userIdentifier = userIdentifier;
}

userIdentifier创建起来并不昂贵,但这是一个 WebApi 应用程序,并且userIdentifier是从另一个依赖于 的对象中提取的,该对象HTTPContext有时为空App_Start。必须在控制器构造函数中指定Lazy似乎是代码异味,因为控制器不需要知道或关心此参数在组合时需要特殊处理。

它是这样注入的:

kernel.Bind<IIdentifier>()
      .ToMethod(x => kernel.Get<IMinimalSecurityToken>().UserID);

在这种情况下,我认为我不能使用 Ninject Factory 扩展,因为它不像新建对象实例那么简单。我宁愿不写一个工厂来处理这种情况,尽管我认为这比将其Lazy插入控制器更好,所以我希望有某种方法可以使用 Ninject 的自动工厂,我只是没有想到。

4

1 回答 1

0

如果您不想使用工厂并且我同意工厂不太适合这里的用例。相反,您可以使用提供者为您提供令牌。

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

kernel.Bind<IIdentifier>().ToProvider<MyIdentityProvider>();
于 2013-11-09T01:23:01.317 回答