سؤال

وحصلت على تطبيق الويب الذي يقوم بتخزين كائن التكوين في ApplicationState. يحتوي هذا الكائن سلسلة الاتصال بقاعدة البيانات من بين أمور أخرى.

وأحيانا أبدأ الموضوع المتزامن للقيام عدد قليل يعد المهام قيد التشغيل، مثل إرسال رسائل البريد الإلكتروني وتحديث قاعدة البيانات.

ولكن منذ هذا الموضوع لم يكن لديك HttpContext لا يمكنني الحصول على الكائن التكوين.

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

وجميع تلك الفئات الداخلية في صافي مزعج حقا.

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

المحلول

ومجرد تمرير ما تريد لموضوع الخاص بك عند بدء تشغيله. استخدام ParameterizedThreadStart مندوب لبدء تشغيله بدلا من مجرد <لأ href = "http://msdn.microsoft.com/en-us/library/system.threading.threadstart٪28v=vs.110٪29.aspx" يختلط = "نوفولو noreferrer "> ThreadStart مندوب. هل يمكن إما تمريرها HttpContext.Current، وإلا حزمة معا على المعلومات التي تريدها موضوع أن يكون لديك، وتمريرها.

نصائح أخرى

إذا <م> حقا يحتاجون إلى الوصول إلى تطبيق الدولة (أو ما شابه) من معالجات المتزامن يجب تعديل فرعية HttpApplication الخاص بك (على سبيل المثال Global.asax) لتخزين سبيل المثال دولة التطبيق (this.Application) إلى خاصية ثابتة خلال Application_Start:

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}

وسيكون أكثر ملاءمة لاستخدام إطار DI لتسجيل هذه الحالة، ولكن إذا كان لديك واحد متاح ربما يمكن تجنب استخدام الدولة تطبيق تماما لتخزين التكوين. وعلاوة على ذلك، هناك إطار التكوين في .NET الذي يتناول مباشرة هذه الحاجة ويوفر القدرة على قراءة التكوين من أي مكان.

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