2016-06-01 34 views
1

Startup.Auth.cs //私はここに私のDbContextを追加したコントローラのコンストラクタでHttpContextがNullになるのはなぜですか? <strong>AccountController.cs</strong>で

// Configure the db context, user manager and signin manager to use a single instance per request 
app.CreatePerOwinContext(ProjectPlannerContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

私は、データベースに関連するものを行うためにたUnitOfWorkインスタンスを必要とするサービスのインスタンスを作成したいです。だからここにコードされています

public AccountController() 
{ 
    contactManager = new ContactManager(UnitOfWork); 
} 

たUnitOfWorkは、次のように定義されたプロパティです:

public UnitOfWork UnitOfWork 
{ 
    get 
    { 
     if (unitOfWork == null) 
     { 
      //Here the HttpContext is NULL 
      unitOfWork = new UnitOfWork(HttpContext.GetOwinContext().Get<ProjectPlannerContext>()); 
     } 

     return unitOfWork; 
    } 
} 

私が最初のアプリケーションを実行すると、私はグローバルな認証フィルタは、そう、適用されています(これは、AccountControllerのloginメソッドへのリクエストを引き起こし、Controllerコンストラクタ内のUnitOfWorkの呼び出しのために、Object参照がインスタンスに設定されていないというエラーを返します)。

私にとっては奇妙なことは、ログインAsp.NET MVCはを使用すると、私は、コンストラクタでcontactManagerの行をコメント場合SignInManagerは次のように定義されたということです。私はできる、

public ApplicationSignInManager SignInManager 
{ 
    get 
    { 
     return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
    } 
    private set 
    { 
     _signInManager = value; 
    } 
} 

そして、これは完璧に動作します登録(オブジェクト参照エラーはここではにスローされません)、データベース内に自分のユーザーが挿入されていることを確認してください。 私の質問は、なぜこれが起こるのか、そしてコンストラクタにない場合に私のサービスを初期化する方法です。のベストプラクティス/ソリューションとは何

public UnitOfWork UnitOfWork 
{ 
    get 
    { 
     if (unitOfWork == null) 
     { 
      unitOfWork = new UnitOfWork(ProjectPlannerContext.Create()); 
     } 

     return unitOfWork; 
    } 
} 

しかし、これは私がすべてのコントローラーでデータベースコンテキストを作成しなければならないことを意味する。..

私は同じようUnitOfWorkのを定義した場合、実際の回避策がありますそれ?

+6

をまだ作成されていない、コントローラがインスタンス化された後に作成される –

+2

この質問は多くの*回 - [ここ](http://stackoverflow.com/questions/28254247/mvc5-ninject-binding-and-httpcontext)、[ここ](http://stackoverflow.com/questions/343268) 5/access-httpcontext-request-in-a-controllers-constructor)、[ここ](http://stackoverflow.com/questions/6850073/why-cant-i-access-the-httpcontext-from-the-controller - 初期化子)、[ここ](http://stackoverflow.com/q/24342887/181087)、[ここ](http://stackoverflow.com/q/223317/181087)。さて、あなたは残りの部分を見つけるために行く、より多くのトンがあります。 – NightOwl888

+0

何度も尋ねられてきましたが、答えを探しているのであれば正しい質問が必要なことがあります。 – Luther

答えて

2

私はここに他のコントローラから派生されますBaseControllerを実装になってしまった、とは一例です:

public abstract class BaseController : Controller 
{ 
    public virtual UnitOfWork UnitOfWork 
    { 
     get 
     { 
      return unitOfWork; 
     } 
    } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (unitOfWork == null) 
     { 
      unitOfWork = new UnitOfWork(HttpContext.GetOwinContext().Get<ProjectPlannerContext>()); 
     } 
    } 

    #region Private members 
    private UnitOfWork unitOfWork; 
    #endregion 
} 

と付加サービス(IContactManager)必要AccountController:それはあるので

public class AccountController : BaseController 
{ 
    public AccountController() 
    { 

    } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     contactManager = new ContactManager(UnitOfWork); 
    } 

    public ActionResult CreateContact(string firstName, string lastName, string email) 
    { 
     ContactModel contact = contactManager.Create(firstName, lastName, email); 

     return JsonNet(new { contact = contact }); 
    } 

    #region Private members 
    private IContactManager contactManager; 
    #endregion 
} 
関連する問題