سؤال

لدي بعض خدمات الويب ASP.NET والتي تشترك جميعها في فئة مساعد مشتركة وتحتاج فقط إلى إنشاء مثيل واحد منها لكل خادم.يتم استخدامه للترجمة البسيطة للبيانات، ولكنه يقضي بعض الوقت أثناء بدء تحميل الأشياء من ملف web.config، وما إلى ذلك. فئة المساعد آمنة بنسبة 100٪ للخيط.فكر في الأمر كمكتبة بسيطة لاستدعاءات المرافق.سأجعل جميع الطرق مشتركة في الفصل، لكني أريد تحميل التكوين الأولي من web.config. لقد قمنا بنشر خدمات الويب إلى IIS 6.0 واستخدام مجمع التطبيقات، مع حديقة ويب تضم 15 عاملاً.

لقد أعلنت عن فئة المساعد كمتغير مشترك خاص في Global.asax، وأضفت خاصية التحميل البطيء المشتركة للقراءة فقط مثل هذا:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

لدي رمز تسجيل في المنشئ لـ MyHelperClass(), ، ويظهر المُنشئ قيد التشغيل لكل طلب، حتى على نفس الموضوع.أنا متأكد من أنني أفتقد بعض التفاصيل الأساسية لـ ASP.NET ولكن MSDN لم يكن مفيدًا جدًا.

لقد حاولت القيام بأشياء مماثلة باستخدام كليهما Application("Helper") و Cache("Helper") وما زلت أرى المنشئ يعمل مع كل طلب.

هل كانت مفيدة؟

المحلول

ليس من الحكمة استخدام حالة التطبيق إلا إذا كنت في حاجة إليها تمامًا، فالأمور أبسط بكثير إذا التزمت باستخدام كائنات لكل طلب.أي إضافة للحالة إلى الفئات المساعدة يمكن أن تسبب كل أنواع الأخطاء الطفيفة.استخدم مجموعة عناصر HttpContext.Current وقم بتهيئتها لكل طلب.وحدة VB ستفعل ما تريد، ولكن يجب عليك التأكد من عدم جعلها ذات حالة.

نصائح أخرى

يمكنك وضع المساعد الخاص بك في حالة التطبيق.قم بذلك في global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

يمكنك استخدام المساعد بهذه الطريقة:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

ينتج عن هذا مثيل واحد لفئة MyHelperClass التي يتم إنشاؤها عند بدء التطبيق ويعيش في حالة التطبيق.نظرًا لأنه تم إنشاء المثيل في Application_Start، يحدث هذا مرة واحدة فقط لكل مثيل HttpApplication وليس لكل طلب.

لقد فعلت شيئًا كهذا في تطبيقي الخاص في الماضي وتسبب في جميع أنواع الأخطاء الغريبة.سيكون لكل مستخدم حق الوصول إلى بيانات أي شخص آخر في العقار.بالإضافة إلى ذلك، قد ينتهي بك الأمر إلى أن يكون أحد المستخدمين في منتصف استخدامه ثم ينقطع بسبب طلب مستخدم آخر له.

لا هناك ليست معزولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top