C# Ninject工厂扩展与懒惰<;T>;

C# Ninject工厂扩展与懒惰<;T>;,c#,ninject,ninject-extensions,C#,Ninject,Ninject Extensions,我尝试注入一个惰性计算的参数: private readonly Lazy\u userIdentifier; 公共文档控制器(惰性用户标识符) { _userIdentifier=userIdentifier; } 创建userIdentifier并不昂贵,但这是一个WebApi应用程序,userIdentifier是从另一个依赖于HTTPContext的对象中提取的,该对象在应用程序启动时为空。必须在控制器构造函数中指定Lazy,这看起来像是一种代码味道,因为控制器不需要知道或关心该参数在

我尝试注入一个惰性计算的参数:

private readonly Lazy\u userIdentifier;
公共文档控制器(惰性用户标识符)
{
_userIdentifier=userIdentifier;
}
创建
userIdentifier
并不昂贵,但这是一个WebApi应用程序,
userIdentifier
是从另一个依赖于
HTTPContext
的对象中提取的,该对象在
应用程序启动时为空。必须在控制器构造函数中指定
Lazy
,这看起来像是一种代码味道,因为控制器不需要知道或关心该参数在合成时是否需要特殊处理

它是这样注射的:

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

我不认为我可以在这种情况下使用Ninject工厂扩展,因为它不像新建对象实例那么简单。我不想编写一个工厂来处理这种情况,尽管我认为这比将
惰性
粘贴到控制器中更好,因此,我希望有某种方法可以使用Ninject的自动工厂,而我只是没有想到。

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

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

kernel.Bind<IIdentifier>().ToProvider<MyIdentityProvider>();
公共类MyIdentityProvider:提供程序
{
...
}
kernel.Bind().ToProvider();

奇怪的是,为什么不使用IMinimalSecurityToken作为控制器的依赖项,而不是这个?因为它携带了一大堆控制器不知道(也不应该知道)的行李。控制器只需要用户做它的工作。我接受这个答案,因为这是我做的,但它暴露了另一个问题,这是针对我的情况。事实证明,我们的身份提供程序使用HTTPContext,因此我确实需要使用工厂(一旦我尝试使用身份做任何事情,结果证明惰性解决方案都不起作用)。如果没有该要求,则首选所提出的解决方案。