2017-01-01 1 views
1

Ninject를 사용하여 응용 프로그램의 모든 Controller 인스턴스에 동일한 HttpClient 객체를 주입하는 권장 방법은 무엇입니까?Ninject를 HttpClient와 함께 사용하는 방법

현재 Adam Freeman의 MVC 서적에 따라 EntityFramework Database 컨텍스트를 주입하고 있습니다. 그러나 HttpClient는 MVC 응용 프로그램의 모든 컨트롤러에서 다시 사용할 수 있으므로 HttpClient에는 이상적이지 않은 각 컨트롤러 인스턴스에 대해 새로운 dbContext가 만들어집니다.

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

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

    ... 
} 

그리고 Ninject에 공장은 다음과 같다 :

생성자

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

답변

0

당신은 단지에 구성을 변경해야합니다 : 요청 범위 지정에 대한 자세한 내용은

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

this을 읽어보십시오.

1

감사합니다. 스티븐. 현재, 나는 다음과 같은 작품을 찾는다. 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 
    } 
} 
관련 문제