ASP.NET MVC: هل تم إنشاء وحدة التحكم لكل طلب؟




asp.net-mvc-3 entity-framework (3)

سؤال بسيط للغاية: هل تم إنشاء وحدات تحكم في ASP.NET لكل طلب HTTP ، أم أنها تم إنشاؤها عند بدء تشغيل التطبيق وإعادة استخدامها خلال الطلبات؟

هل سيتم إنشاء وحدة التحكم فقط لطلب HTTP معين؟

إذا كانت الافتراضات السابقة صحيحة ، فهل يمكنني الاعتماد عليها؟ أرغب في إنشاء سياق قاعدة البيانات (Entity Framework) الذي سيعيش فقط لطلب واحد. إذا قمت بإنشائه كخاصية تمت تهيئتها في مُنشئ وحدة التحكم ، فهل سيتم منحه إنشاء مثيل جديد للسياق لكل طلب؟

https://code.i-harness.com


سيتم إنشاء وحدة التحكم عند تنفيذ أي إجراء في وحدة تحكم محددة.

لدي مشروع حيث ترث كافة وحدات التحكم الخاصة بي من ApplicationController وفي كل مرة يتم فيها تنفيذ إجراء ، يتم ضرب نقطة الإيقاف داخل ApplicationController - بغض النظر عن وحدة التحكم " الحالية " الخاصة به.

أقوم بتهيئة وكيلي (الذي يعمل كسياق بلدي) عندما يتم إنشاء وحدة التحكم الخاصة بي على النحو التالي:

    public IWidgetAgent widgetAgent { get; set; }

    public WidgetController()
    {
        if (widgetAgent == null)
        {
            widgetAgent = new WidgetAgent();
        }

    }

ومن الواضح أن هذا ليس ما تحتاج إليه - كما ذكرت أنك تريد فقط حالة واحدة في كل مرة يتم استدعاؤها. ولكنه مكان جيد للتحقق مما يجري في كل مرة ولضمان عدم وجود مثيل آخر من السياق الخاص بك في الوقت الحالي.

أتمنى أن يساعدك هذا.


لقد قمت بإنشاء مُنشئ فارغ لوحدة تحكم ووضع نقطة فاصل في المُنشئ. حصلت على ضرب في كل مرة كان هناك طلب جديد. لذلك أعتقد أنه تم إنشاؤه لكل طلب.


يتم إنشاء وحدة تحكم لكل طلب يقدمه المراقب المالي (وهو افتراضياً هو DefaultControllerFactory).

http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx

لاحظ أن Html.Action Html Helper سيقوم بإنشاء وحدة تحكم أخرى.

الإصدار المختصر هو أن ControllerActivator.Create يسمى (لكل طلب) لإنشاء وحدة تحكم (التي تحكم وحدة تحكم جديدة إما من خلال DependencyResolver أو من خلال Activator إذا لم يتم إعداد أي Resolver):

public IController Create(RequestContext requestContext, Type controllerType) {
                    try {
                        return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
                    }

الإصدار الأطول هو هذا (إليك الرمز من المصدر من MvcHandler)

 protected internal virtual void ProcessRequest(HttpContextBase httpContext)
    {
        SecurityUtil.ProcessInApplicationTrust(() =>
        {
            IController controller;
            IControllerFactory factory;
            ProcessRequestInit(httpContext, out controller, out factory);

            try
            {
                controller.Execute(RequestContext);
            }
            finally
            {
                factory.ReleaseController(controller);
            }
        });
    }

private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
        {
            //non relevant code

            // Instantiate the controller and call Execute
            factory = ControllerBuilder.GetControllerFactory();
            controller = factory.CreateController(RequestContext, controllerName);
            if ( controller == null )
            {
                throw new InvalidOperationException(
                    String.Format(
                        CultureInfo.CurrentCulture,
                        MvcResources.ControllerBuilder_FactoryReturnedNull,
                        factory.GetType(),
                        controllerName));
            }
        }

هنا رمز المصنع تحكم

 public virtual IController CreateController(RequestContext requestContext, string controllerName) {
            Type controllerType = GetControllerType(requestContext, controllerName);
            IController controller = GetControllerInstance(requestContext, controllerType);
            return controller;
        }

الذي يدعو أساسا هذا:

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
            return ControllerActivator.Create(requestContext, controllerType);
        }

الذي يستدعي هذا الأسلوب في ControllerActivator (يحاول هذا الكود طرح DependencyResolver لمثيل ، أو يستخدم فئة Activator فقط):

public IController Create(RequestContext requestContext, Type controllerType) {
                try {
                    return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
                }

قد يقع هذا تحت الكثير من المعلومات ... ولكني أردت أن أظهر أنك تحصل فعلاً على وحدة تحكم جديدة لكل طلب.





httprequest