niedziela, 7 października 2012

Tworzenie i zwalnianie DbContext w aplikacji ASP.NET MVC

Korzystając z aplikacji ASP.NET MVC i EntityFrameworka warto stworzyć uniwersalny kod pobierania i zwalniania DbContex.

Przejdę od razu do implementacji:
Code:
    public static class MvcContext
    {
        public const string ContextName = "DatabaseContext";

        public static DatabaseContext Current
        {
            get
            {
                if (HttpContext.Current.Items[ContextName] == null)
                {
                    HttpContext.Current.Items[ContextName] = new DatabaseContext();
                }

                return (DatabaseContext)HttpContext.Current.Items[ContextName];
            }
        }
    }

Plik Global.asax:

Code:
public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }

        protected void Application_EndRequest()
        {
            var entityContext = HttpContext.Current.Items[MvcContext.ContextName] as DatabaseContext;
            if (entityContext != null)
            {
                entityContext.Dispose();
            }
        }

        protected void Application_BeginRequest()
        {

        }
    }


Pytanie odnośnie kodu powyżej może być jedno: dlaczego DbContext nie jest tworzony w Application_BeginRequest() ?

Metody Application_BeginRequest oraz Application_EndRequest wywoływane są przy każdym żądaniu. Jeżeli weźmiemy stronę która ma 30 obrazków - zostałoby stworzonych 30 DbContext-tów.

W przypadku powyższego kodu DbContext zostanie stworzony tylko wtedy kiedy będzie potrzebny a zwolniony po zakończeniu żądania.

Brak komentarzy:

Prześlij komentarz