如何将 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?