我可以使用 Ninject 将 IKernel 注入 class

Can I inject IKernel into class with Ninject

我想在不使用 new 的情况下注入 AuthenticationService:

IAuthenticationService authenticationService = null;
if (HttpContext.Current != null && HttpContext.Current.Session["LoggedUser"] == null)
{
    HttpContext.Current.Session["LoggedUser"] = new AuthenticationService();
}
authenticationService = (AuthenticationService)HttpContext.Current.Session["LoggedUser"];

我正在考虑使用 kernel.Get(),但我不知道注入 IKernel 是否是一个好习惯。我也在考虑使用工厂,但我不知道如何将它与 Ninject.

结合起来

你有什么建议?

您不应将 IKernel 注入 class,如果您正确利用了 Ninject 提供的 IOC 容器,则没有必要这样做。您可以为服务设置类似于以下内容的绑定:

kernel.Bind<IAuthenticationService>().To<AuthenticationService>();

请注意,根据您的 Ninject 设置方式,这可能发生在几个不同的地方。如果您提供更多代码,我可以详细说明这是怎么回事。对于许多人来说,它在 NinjectWebCommon.cs class.

然后在你想要注入 IAuthenticationService 的任何 class 中,只需像下面这样传入 IAuthenticationService

public class WhateverClass
{
  private IAuthenticationService _authenticationService;

  public WhateverClass(IAuthenticationService authenticationService)
  {
    _authenticationService = authenticationService;
  }

  //some other properties or methods that make use of authentication service here
}