【问题标题】:How to use Ninject with HttpClient如何将 Ninject 与 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();        
  }
}

【问题讨论】:

    标签: asp.net-mvc ninject dotnet-httpclient


    【解决方案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
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-09
        • 2016-07-16
        • 2011-02-06
        • 1970-01-01
        • 2012-12-10
        • 2014-10-28
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多