এএসপি.নেট এমভিসি: প্রতিটি অনুরোধের জন্য কন্ট্রোলার তৈরি করা হয়?


112

খুব সাধারণ প্রশ্ন: এএসপি.এনইটি-র কন্ট্রোলারগুলি কি প্রতিটি এইচটিটিপি অনুরোধের জন্য তৈরি করা হয়েছে, বা তারা অ্যাপ্লিকেশন স্টার্টআপে তৈরি করা হয়েছে এবং অনুরোধ জুড়ে পুনরায় ব্যবহার করা হয়েছে?

নিয়ামকটি কি কোনও নির্দিষ্ট এইচটিটিপি অনুরোধের জন্য তৈরি করা হবে?

আমার পূর্ববর্তী অনুমানগুলি যদি সঠিক হয় তবে আমি কি এটির উপর নির্ভর করতে পারি? আমি ডাটাবেস প্রসঙ্গ তৈরি করতে চাই (সত্তা ফ্রেমওয়ার্ক) যা কেবলমাত্র একটি অনুরোধের জন্য বেঁচে থাকবে। যদি আমি এটিকে নিয়ামকের নির্মাণকর্তার সূচনা হিসাবে সম্পত্তি হিসাবে তৈরি করি, তবে তা কি প্রতিটি অনুরোধের জন্য প্রসঙ্গের নতুন উদাহরণ তৈরি করা হবে?


16
আপনার নির্মাতার একটি ব্রেকপয়েন্ট রাখুন এবং আপনি কী জানতে পারেন তা দেখুন ...
গ্রেগ বি

10
@ গ্রেগ বি: দুর্দান্ত ধারণা ছাড়া এটি যদি আমাকে সর্বদা এরকম আচরণ করে তবে তা আমাকে জানায় না - যদি পরিস্থিতি পরিবর্তন হয় এবং কিছু নিয়ামক তার আচরণ পরিবর্তন করে তবে আমার যে বাগটি পাওয়া যাবে এটি খুঁজে পাওয়া সত্যিই কঠিন হতে পারে ...
রাস্টো

@ ডিস্টো আপনি কীভাবে চেক করবেন এটি যদি সর্বদা এর মতো কাজ করে তবে? আপনার আবেদন প্রতিটি অনুরোধ পরীক্ষা?
গ্রেগ বি

4
@ টড স্মিথ কিছু লিঙ্ক বা কমপক্ষে পুরো নাম দয়া করে। গাছের অক্ষর আইওসি গুগল করা শক্ত। ধন্যবাদ.
রাস্তো

2
@drasto আইওসি = নিয়ন্ত্রণের ইনভার্সান en.wikipedia.org/wiki/Inversion_of_control
বালা আর

উত্তর:


103

দ্বারা প্রতিটি অনুরোধের জন্য একটি কন্ট্রোলার তৈরি করা হয় ControllerFactory(যা ডিফল্টরূপে এটি হয় DefaultControllerFactory)।

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

মনে রাখবেন যে Html.Actionএইচটিএমএল সহায়ক অন্য একটি নিয়ামক তৈরি করবে।

সংক্ষিপ্ত সংস্করণটিকে ControllerActivator.Createবলা হয় (প্রতিটি অনুরোধের জন্য) একটি কন্ট্রোলার তৈরি করতে (যা কোনও নতুন কন্ট্রোলারকে ডিপেন্ডেন্সি রিসোলভারের মাধ্যমে বা অ্যাক্টিভেটরের মাধ্যমে কোনও রেজলভার সেটআপ না করা থাকলে) তৈরি করে:

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

লম্বা সংস্করণটি হ'ল (এমভিসিহ্যান্ডলার থেকে উত্স থেকে কোডটি এখানে):

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(এই কোডটি নির্ভরতার জন্য রিসোলভারকে উদাহরণস্বরূপ জিজ্ঞাসা করার চেষ্টা করে, বা কেবল অ্যাক্টিভেটর শ্রেণি ব্যবহার করে):

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

এটি খুব বেশি তথ্যের আওতায় পড়তে পারে ... তবে আমি এটি দেখাতে চেয়েছিলাম যে আপনি প্রতিটি অনুরোধের জন্য সত্যই একটি নতুন নিয়ামক পান।


@ ড্যানিয়েল @ ড্রাস্টো এখানে প্রশংসাপত্রটি রয়েছে aspnet.codeplex.com/SourceControl/changeset/view/63930#266503
বালা আর

32

আমি একটি নিয়ামকের জন্য একটি খালি কনস্ট্রাক্টর তৈরি করেছি এবং কন্সট্রাক্টরে একটি ব্রেক পয়েন্ট রেখেছি। এটি একটি নতুন অনুরোধ ছিল প্রতিবার এটি হিট হয়েছে। সুতরাং আমি মনে করি এটি প্রতিটি অনুরোধের জন্য তৈরি করা হয়েছে।


3
+1 আমি আশা করি আপনি ঠিক আছেন তবে আমি "চেষ্টা করেছি এমন সমস্ত ক্ষেত্রে" এর চেয়ে কিছু ভাল অনুমোদিত জ্ঞান চাই। যদি এটি কখনও কখনও কোনও কারণে এটির মতো কাজ না করে তবে এর অর্থ বাগ।
রাস্তো

6
@ ডিস্ট্রো: চিন্তা করার দরকার নেই। কন্ট্রোলার প্রতিটি অনুরোধের জন্য তাত্ক্ষণিক হয়। কিছু স্মৃতি যদিও পুনঃব্যবহৃত হয় তবে আপনার নিয়ামক রাষ্ট্র সম্পর্কে চিন্তা করা উচিত নয় (যদি আপনার একটি থাকে)। এটি আশানুরূপভাবে শুরু করা হবে। তবে এমন পরিস্থিতি তৈরি হতে পারে যেখানে একাধিক নিয়ামক তাত্ক্ষণিক হয়ে উঠবেন। এবং Html.RenderAction("action", "controller");
এরপরেই

@ রবার্টকরিটনিক এবং বালা আর, আমার একটি প্রশ্ন আছে দয়া করে। অ্যাকশন পদ্ধতিটি তাদের দেখার জন্য বা স্টুডেন্ট <স্টুডেন্ট> এর মতো তৈরি করা বস্তুগুলির জন্য কী ঘটে? তারা নিষ্পত্তি পেতে? এবং কোনও নতুন অনুরোধ এলে এই বিষয়গুলির জন্য কী ঘটে?
মাহদী আলখতিব

3

নির্দিষ্ট নিয়ন্ত্রকের কোনও ক্রিয়াকলাপ সম্পাদন করা হলে নিয়ন্ত্রণকারী তৈরি করা হবে।

আমার একটি প্রকল্প রয়েছে যেখানে আমার সমস্ত কন্ট্রোলাররা ApplicationControllerযখনই কোনও ক্রিয়াকলাপ সম্পাদন করে ততবার উত্তরাধিকার সূত্রে উত্তেজিত হয়, ব্রেক্টপয়েন্টটি ApplicationControllerতার " বর্তমান " নিয়ামক নির্বিশেষে আঘাত করে inside

আমি যখনই আমার নিয়ামক এর মতো তৈরি হয় তখন আমি আমার এজেন্ট (যা আমার প্রসঙ্গ হিসাবে কাজ করে) শুরু করি:

    public IWidgetAgent widgetAgent { get; set; }

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

    }

এটি আপনার যা প্রয়োজন তা অবশ্যই স্পষ্ট নয় - যেমন আপনি উল্লেখ করেছেন যে প্রতিবার যখন একবার বলা হয়েছিল আপনি কেবলমাত্র একক নজির চেয়েছিলেন। তবে প্রতিবার কী চলছে তা যাচাই করা এবং আপনার প্রসঙ্গের আর কোনও উদাহরণ বর্তমানে উপস্থিত না রয়েছে তা নিশ্চিত করার জন্য এটি ভাল জায়গা।

আশাকরি এটা সাহায্য করবে.


2

নিয়ন্ত্রক প্রতিটি অনুরোধের জন্য তৈরি করা হয়। Gobal.aspx এর রাউটিংয়ে ম্যাজিকটি ঘটে। ম্যাপিংয়ের পাথগুলি এমভিসিকে নির্দেশ দেয় যে কোন নিয়ন্ত্রক তৈরি করতে হবে এবং কল করার জন্য নিয়ামকের উপর ক্রিয়াকলাপ এবং তাদের কাছে পরামিতিগুলি পৌঁছে দেয়।

http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb


উদ্ধৃতি আবশ্যক - লিঙ্কযুক্ত নথিতে সহায়ক তথ্য খুঁজে পাচ্ছে না। আপনাকে ধন্যবাদ
রাস্তো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.