如何将 Ninject 与 HttpClient 一起使用

Posted

技术标签:

【中文标题】如何将 Ninject 与 HttpClient 一起使用【英文标题】:How to use Ninject with HttpClient 【发布时间】:2017-01-01 01:53:19 【问题描述】:

使用 Ninject 将相同的 HttpClient 对象注入应用程序中的所有 Controller 实例的推荐方法是什么?

目前,我正在按照 Adam Freeman 的 MVC 书注入一个 EntityFramework 数据库上下文,如下所示。但是,这会为每个控制器实例创建一个新的 dbContext,这对于 HttpClient 可能并不理想,因为 HttpClient 旨在在 MVC 应用程序中的所有控制器之间重用。

构造函数:

public class AccountController : Controller

  MyDBContext dbContext = new MyDBContext();

  public AccountController(MyDBContext context)
  
    dbContext = context;
  

  ...

而忍者工厂如下:

/// Class based on Adam Freeman's MVC book to use dependency injection to create controllers
public class NinjectControllerFactory : DefaultControllerFactory

  private IKernel ninjectKernel;

  public NinjectControllerFactory()
  
    ninjectKernel = new StandardKernel();
    AddBindings();
  

  protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
  
    return controllerType == null
      ? null
      : (IController)ninjectKernel.Get(controllerType);
  

  private void AddBindings()
  
    ninjectKernel.Bind<MyDBContext>().ToSelf().InTransientScope();        
  

【问题讨论】:

【参考方案1】:

您只需将配置更改为:

ninjectKernel.Bind<MyDBContext>().ToSelf().InRequestScope();

有关请求范围的更多信息,请阅读this。

【讨论】:

【参考方案2】:

谢谢史蒂文。目前,我发现以下工作。我在 NinjectController 中创建了一个静态 HttpClient 属性,并将其绑定为单例范围内的常量。 Daniel's book 有助于更好地理解 Ninject。

/// Class based on Adam Freeman's MVC book to use dependency injection to create controllers
public class NinjectControllerFactory : DefaultControllerFactory

  private IKernel ninjectKernel;
  private static HttpClient WebAPIClient; // added

  public NinjectControllerFactory()
  
    ninjectKernel = new StandardKernel();

    WebAPIClient = new HttpClient();  // added
    WebAPIClient.BaseAddress = new Uri("http://localhost:1153");  // added 

    AddBindings();
  

  protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
  
    return controllerType == null
      ? null
      : (IController)ninjectKernel.Get(controllerType);
  

  private void AddBindings()
  
    ninjectKernel.Bind<MyDBContext>().ToSelf().InTransientScope();
    ninjectKernel.Bind<HttpClient>().ToConstant(WebAPIClient).InSingletonScope();  // added
  

【讨论】:

以上是关于如何将 Ninject 与 HttpClient 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net Web 窗体上实现 Ninject 或 DI?

如何使用Ninject将用户管理器注入到身份2中的默认身份模型的帐户控制器

如何在c#类库中使用Ninject

使用Ninject进行DI(依赖注入)

AOP Ninject 停止被调用的拦截方法

让 InRequestScope 与 Ninject 和 WebApi 一起工作