2017-01-01 15 views
1

Ninjectを使用して同じHttpClientオブジェクトをアプリケーションのすべてのControllerインスタンスに注入するにはどうすればよいでしょうか?NinjectをHttpClientで使用する方法

現在、Adam FreemanのMVCブックに続いて、EntityFrameworkデータベースコンテキストを次のように挿入しています。ただし、HttpClientはMVCアプリケーションのすべてのコントローラで再利用されるため、コントローラインスタンスごとに新しいdbContextが作成されますが、これはおそらくHttpClientにとって理想的ではありません。

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

ありがとうSteven。現在、私は次のようなことが分かります。 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 
    } 
} 
関連する問題