Наследование контекста данных LINQ-to-SQL от базового контроллера - PullRequest
5 голосов
/ 21 апреля 2010

Мой базовый класс контроллеров, BaseController, наследуется общедоступными контроллерами для доступа к общему контексту данных между запросами с LINQ-to-SQL.

  • Получаю ли я доступ к своему контексту данных эффективным и безопасным способом, сохраняя его в HttpContext.Current.Items для каждого HTTP-запроса?

DataContextHelper класс

internal static class DataContextHelper
{
    public static MyDataContext CurrentContext
    {
        get
        {
            if (HttpContext.Current.Items["MyDataContext"] == null)
            {
                MyDataContext context = new MyDataContext();
                HttpContext.Current.Items["MyDataContext"] = context;
            }
            return (MyDataContext)HttpContext.Current.Items["MyDataContext"];
        }
    }
}

BaseController класс:

public class BaseController : Controller
{
    protected MyDataContext db
    {
        get {
            return DataContextHelper.CurrentContext;
        }
    }
}

HomeController класс:

[HandleError]
public class HomeController : BaseController // inherits db member
{
    public ActionResult SomeAction(string id)
    {
        User user = db.Users.First(u => u.UserId == id);
        // ... do stuff
        db.SubmitChanges();
    }
}

1 Ответ

4 голосов
/ 21 апреля 2010

Да, это общий шаблон для всех основных ORM как с WebForms, так и с MVC.

Единственное, что я хотел бы добавить явное удаление после выполнения каждого действия контроллера. просто чтобы убедиться, что все утилизировано правильно.

В BaseController.cs :

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (HttpContext.Current.Items["MyDataContext"] == null)
            return;

        var context = (MyDataContext)HttpContext.Current.Items["MyDataContext"];

        context.Dispose();
    }
...