BaseController に、LINQ to SQL データ コンテキスト (またはテスト用の偽のコンテキスト) を保持する DataContext というプロパティがあります。パラメーターなしのコンストラクターを使用する場合 (つまり、ASP.NET MVC への要求が行われる場合)、LINQ to SQL データ コンテキストの新しいインスタンスがプロパティに割り当てられます。
public class BaseController : Controller {
public IDataContextWrapper DataContext { get; set; }
public BaseController() : this(new DataContextWrapper<MyDataContext>()) { }
public BaseController(IDataContextWrapper context) {
DataContext = context;
}
}
また、BaseController で、いくつかのグローバル ViewData 項目を設定しました。
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
ViewData["Example"] = DataContext.Table<Example>().Count();
base.OnActionExecuting(filterContext);
}
これは、ほとんどすべてのアクションでうまく機能しています。機能しない唯一のものは、私の AccountController の Logout アクションです。
public ActionResult Logout() {
FormsAuth.SignOut();
return RedirectToResult("Login");
}
これにより、BaseController.OnActionExecuting 中に NullReferenceException が発生します。その特定のアクションを実行すると、DataContext プロパティは null になります。
これが 1 つのアクションでのみ発生するのはなぜですか?
注: IDataContextWrapper と DataContextWrapper は、LINQ to SQL DataContext オブジェクトの既存の機能をラップするだけなので、単体テストで偽のコンテキストに置き換えることができます。独自に破棄することはありませんが、基礎となる DataContext に任せているので、それは問題ではないと確信しています。