2017-01-01 1 views
1

Quelle serait la manière recommandée d'utiliser Ninject pour injecter le même objet HttpClient dans toutes les instances de contrôleur dans une application?Comment utiliser Ninject avec HttpClient

Actuellement, j'injecte un contexte de base de données EntityFramework suivant le livre MVC d'Adam Freeman comme suit. Cependant, ceci crée un nouveau dbContext pour chaque instance de contrôleur, ce qui n'est probablement pas idéal pour HttpClient, puisque HttpClient est censé être réutilisé sur tous les contrôleurs dans une application MVC.

Constructeur:

public class AccountController : Controller 
{ 
    MyDBContext dbContext = new MyDBContext(); 

    public AccountController(MyDBContext context) 
    { 
    dbContext = context; 
    } 

    ... 
} 

Et l'usine Ninject est la suivante:

/// 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();   
    } 
} 

Répondre

0

Il vous suffit de changer votre configuration:

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

Pour plus d'informations sur détermination de la portée de la demande , veuillez lire le this.

1

Merci Steven. Actuellement, je trouve que les travaux suivants. J'ai créé une propriété HttpClient statique dans le NinjectController et je l'ai liée comme constante dans la portée singleton. Daniel's book a été utile pour mieux comprendre 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 
    } 
}