স্থিত শ্রেণীর উদাহরণগুলি কি কোনও অনুরোধ বা এএসপি.নেটে কোনও সার্ভারের সাথে অনন্য?


182

একটি এএসপি.এনইটি ওয়েবসাইটে স্ট্যাটিক ক্লাসগুলি প্রতিটি ওয়েব রিকুয়েস্টের কাছে অনন্য, নাকি যখনই প্রয়োজন হয় জিএসইডি তা নিষ্পত্তি করার সিদ্ধান্ত নেয় তখনই তারা ইনস্ট্যান্ট করা হয়?

আমার জিজ্ঞাসার কারণটি হ'ল আমি সি # এর আগে কিছু স্থির ক্লাস লিখেছিলাম এবং আচরণটি আমার প্রত্যাশার চেয়ে আলাদা। আমি স্থির ক্লাসগুলি প্রতিটি অনুরোধের জন্য অনন্য হতে পারে বলে আশাবাদী, তবে এটি মনে হয় না।

যদি তারা প্রতিটি অনুরোধের জন্য স্বতন্ত্র না হয় তবে তাদের অনুমতি দেওয়ার কোনও উপায় আছে কি?

আপডেট:
ড্রিস আমাকে যে উত্তর দিয়েছে তা হ'ল আমার যা প্রয়োজন তা হ'ল। আমি ইতিমধ্যে একটি সিঙ্গলটন ক্লাস ব্যবহার করছিলাম, তবে এটি একটি স্থির উদাহরণ ব্যবহার করছিল এবং তাই অনুরোধগুলির মধ্যে ভাগ করা হচ্ছিল এমনকি ব্যবহারকারীরা পৃথক হলেও যা এই ক্ষেত্রে খারাপ জিনিস ছিল। ব্যবহার HttpContext.Current.Itemsআমার সমস্যাটি নিখুঁতভাবে সমাধান করে । ভবিষ্যতে যে কেউ এই প্রশ্নটিতে হোঁচট খাচ্ছে তার জন্য, এখানে আমার বাস্তবায়ন, সরলীকৃত এবং সংক্ষিপ্ত করা হয়েছে যাতে প্যাটার্নটি বোঝা সহজ হয়:

using System.Collections;
using System.Web;

public class GloballyAccessibleClass
{
    private GloballyAccessibleClass() { }

    public static GloballyAccessibleClass Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if(!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new GloballyAccessibleClass();
            }
            return items["TheInstance"] as GloballyAccessibleClass;
        }
    }
}

কেবল একটি মাথা আপ: আপনি যদি আপনার অনুরোধটি পুনর্নির্দেশ করেন তবে বলুন যে filterContext.Result = new RedirectResult(...)আপনি আপনার আইটেমগুলি হারাবেন কারণ একটি নতুন এইচটিপিপেক্সটেক্সট তৈরি হবে। এখানে আরও বিশদ: স্ট্যাকওভারফ্লো.com
রিবেইরো

একটি ভাল উত্তরের সাথে সম্পর্কিত একটি প্রশ্ন stackoverflow.com/q/5219431 এ রয়েছে
থিওফিলাস

উত্তর:


146

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

অনুরোধ হিসাবে যদি আপনার একই জীবনকাল সহ কোনও উদাহরণের প্রয়োজন হয় তবে আমি HttpContext.Current.Itemsসংগ্রহটি ব্যবহার করার পরামর্শ দেব । এটি আপনার অনুরোধটি থ্রোগআউট করার প্রয়োজন এমন স্টাফ রাখার জায়গা হিসাবে নকশার মাধ্যমে। সুন্দর ডিজাইন এবং পঠনযোগ্যতার জন্য, আপনি এই আইটেমগুলি পরিচালনা করতে সহায়তা করতে সিঙ্গলটন প্যাটার্নটি ব্যবহার করতে পারেন। কেবলমাত্র একটি সিঙ্গলটন ক্লাস তৈরি করুন যা এর উদাহরণটি সঞ্চয় করে HttpContext.Current.Items। (ASP.NET এর জন্য আমার সাধারণ লাইব্রেরিতে, এই উদ্দেশ্যে আমার একটি জেনেরিক সিঙ্গলটনআরকেষ্ট ক্লাস রয়েছে)।


3
আপনি জড়িত আপনার একক প্যাটার্ন একটি নমুনা প্রদান করতে পারেন HttpContext.Current.Items?
Airn5475

আমার পরিস্থিতি সম্পর্কে আরও বিশদ: আমার ওয়েব অ্যাপ্লিকেশনটিতে, ব্যবহারকারী একটি ভাগ করা শ্রেণীর সম্পত্তি ব্যবহার করে এমন কোডের একটি শ্রেণিকালীন লাইব্রেরির মধ্য দিয়ে চলবে। আমি এই সম্পত্তিটি ব্যবহারকারী হিসাবে নির্দিষ্ট হতে চাই, তবে আমি এই সম্পত্তিটি বিভিন্ন ফাংশনের কাছে হস্তান্তর করতে চাই না। আপনি যে নকশাটির উল্লেখ করেছেন, এটি কি সঠিকভাবে পরিচালনা করতে পারে?
Airn5475

দয়া করে, আপনি কি সিঙ্গলটনআকুয়েস্ট ক্লাস ভাগ করতে পারবেন?
টেবো

আমি স্ট্যাটিক ক্লাসে কোনও ডেটা সঞ্চয় করি না। আমি কেবল ডেটা পেতে বা ডেটা স্তর হিসাবে ডেটা সেট করার জন্য স্ট্যাটিক ক্লাস ব্যবহার করি। তাহলে কি কোন সমস্যা আছে?
চটকদার

"static instances will not be GC'ed before the application pool is recycled, and therefore everything that is referenced by the static instance, will not be GC'ed"- এটির জন্য কি কোনও উত্স আছে, কারণ আমি অন্য কোথাও যা পড়েছি তার সাথে এটি কোনও ধারণা এবং দ্বন্দ্ব বোধ করে না। অ্যাপপুলটি পুনর্ব্যবহার করা হলে সম্পর্কিত অ্যাপ ডোমেনটি পুরোপুরি ছিন্ন হয়ে যায় এবং জিসি'ড হয়। এটি যখন ঘটে তখন কোনও সম্পর্কিত স্থির দৃষ্টান্তগুলিও GC'd হবে কারণ তাদের মূল (অ্যাপডোমাইন) চলে গেছে। পুলের পুনর্ব্যবহারের অংশ হিসাবে একটি নতুন অ্যাপডোমাইন তৈরি হয় এবং এটি সম্পর্কিত স্ট্যাটিক দৃষ্টান্তগুলির সূচনা হয়।
নিক

30

স্থিতিশীল সদস্যদের কেবলমাত্র বর্তমান কর্মী প্রক্রিয়া করার সুযোগ রয়েছে, সুতরাং অনুরোধগুলির সাথে এর কোনও সম্পর্ক নেই কারণ বিভিন্ন অনুরোধগুলি একই শ্রমিক প্রক্রিয়া দ্বারা পরিচালিত হতে পারে বা নাও পারে।

  • কোনও নির্দিষ্ট ব্যবহারকারীর সাথে এবং অনুরোধগুলি জুড়ে ডেটা ভাগ করার জন্য, এইচটিটিপি কনটেক্সট.কন্টার.সেশন ব্যবহার করুন।
  • নির্দিষ্ট অনুরোধের মধ্যে ডেটা ভাগ করার জন্য, HttpContext.Current.Items ব্যবহার করুন।
  • পুরো অ্যাপ্লিকেশন জুড়ে তথ্য ভাগ করে নেওয়ার জন্য, হয় তার জন্য একটি পদ্ধতি লিখুন, অথবা আইআইএসকে একটি একক প্রক্রিয়া নিয়ে কাজ করতে এবং একটি সিঙ্গলটন / অ্যাপ্লিকেশন অ্যাপ্লিকেশন লিখতে কনফিগার করুন।

যাইহোক, কর্মী প্রক্রিয়াগুলির ডিফল্ট সংখ্যা 1, সুতরাং এই কারণেই ওয়েব লোকেরা এই ভেবে ভরে যায় যে স্থির সদস্যদের পুরো প্রয়োগের সুযোগ রয়েছে।


11

প্রকারভেদগুলি কোনও অ্যাপ্লিকেশন ডোমেনে অন্তর্ভুক্ত রয়েছে, তাই আমি আশা করব যতক্ষণ না অ্যাপ ডোমেনটি পুনর্ব্যবহার না করা হয়, বা যদি অনুরোধটি কোনও অন্য অ্যাপ্লিকেশন ডোমেন দ্বারা সরবরাহ করা হয় তবে স্থির শ্রেণি উপস্থিত থাকবে।

একটি নির্দিষ্ট অনুরোধের সাথে অবজেক্টগুলিকে নির্দিষ্ট করার জন্য আমি বেশ কয়েকটি উপায় সম্পর্কে ভাবতে পারি যে আপনি যা করতে চান তার উপর নির্ভর করে, উদাহরণস্বরূপ আপনি অ্যাপ্লিকেশন.বিগিনক্রয়েস্টে বস্তুটি ইনস্ট্যান্ট করতে পারেন এবং তারপরে এটি HTTPRequest অবজেক্টে সংরক্ষণ করতে পারেন যাতে এটিতে সমস্ত বস্তুর দ্বারা প্রবেশ করা যায় অনুরোধ প্রক্রিয়াজাতকরণ পাইপলাইন।


4

যদি তারা প্রতিটি অনুরোধের জন্য স্বতন্ত্র না হয় তবে তাদের অনুমতি দেওয়ার কোনও উপায় আছে কি?

নাঃ। স্থির সদস্যরা এএসপি.এনইটি প্রক্রিয়া দ্বারা মালিকানাধীন এবং ওয়েব অ্যাপ্লিকেশনটির সমস্ত ব্যবহারকারীদের দ্বারা ভাগ করা হয় । আপনার অন্যান্য সেশন ম্যানেজমেন্ট কৌশল যেমন সেশন ভেরিয়েবলগুলিতে ফিরে যেতে হবে।


1

Applicationস্তরে সাধারণত স্থিতিশীল পদ্ধতি, বৈশিষ্ট্য এবং শ্রেণি সাধারণ । যতক্ষণ অ্যাপ্লিকেশন বেঁচে থাকে ততক্ষণ সেগুলি ভাগ করে নেওয়া হয়।

ThreadStaticবৈশিষ্ট্যটি ব্যবহার করে আপনি একটি আলাদা আচরণ নির্দিষ্ট করতে পারেন । সেক্ষেত্রে সেগুলি বর্তমান থ্রেডের সাথে সুনির্দিষ্ট হবে, যা আমি মনে করি, প্রতিটি অনুরোধের জন্য নির্দিষ্ট।
যদিও এটি অত্যধিক জটিল বলে মনে হচ্ছে আমি এটিকে পরামর্শ দেব না।

আপনি HttpContext.Current.Itemsএকটি অনুরোধের জন্য স্টাফ সেট আপ করতে বা HttpContext.Current.Sessionকোনও ব্যবহারকারীর জন্য স্টাফ সেট আপ করতে (অনুরোধের বাইরে) ব্যবহার করতে পারেন।

সাধারণত যদিও, আপনার মতো জিনিসগুলি ব্যবহার না করা অবধি, Server.Transferসর্বোত্তম উপায়টি মূলত জিনিসগুলি একবার তৈরি করা এবং তারপরে পদ্ধতি আহ্বানের মাধ্যমে তাদের স্পষ্টভাবে পাস করা।


3
জন স্কিট আমাদের দেখায় যে ThreadStatic নিরাপদ না হয় ASP.NET stackoverflow.com/questions/4791208/...
মার্ক Lindell

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