سؤال

كنت أتساءل فقط كم من الوقت ينبغي أن يعيش datacontext حقًا. جميع كتب الأنماط والممارسات مثل Dino Esposito's Microsoft .NET: تطبيقات الهندسة المعمارية للمؤسسة أخبرك ، يجب ألا يعيش DataContext لفترة طويلة ، ولا ينبغي أن يتم تخزينه مؤقتًا. ولكن ما هي مدة الوقت المناسب؟ طلب ويب كامل ، وحدة عمل ، معاملة ، استعلام واحد فقط في وقت واحد؟ (أفترض أن طلب الويب عادة ما يكون أكثر من مجرد وحدة عمل واحدة)

دعنا نقول أنك تستخدم إطار الكيان كأداة ORM في تطبيق الويب. لكن ماذا عن نمط خريطة الهوية في هذا السيناريو. دعنا نقول إنك حصلت على مثيل مخصص لعميل DAL ، والذي ينشئ datacontext وفاتورة أخرى dal ، والتي تقوم بإنشاء dataContext جديد لغرضه أيضًا. إذا كنت ستحصل على فئة أساسية لجميع DALS ، فإن ذلك ينشئ مثيلًا واحدًا من ObjectContext ويتخلص من هذا في النهاية. هل يعتبر ذلك أ سيئ تطبيق؟ قد يكون من المنطقي الحصول على كائن واحد فقط لطلب ويب واحد ، في رأيي. يمكن أن يستفيد من الدعم نمط خريطة الهوية بواسطة إطار الكيان كميزة واحدة فقط.

أي أفكار أو تعليقات أو أفكار أو نقد؟

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

المحلول 3

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

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

لدى ASP.NET حدثين في تطبيقهما ودورة حياة الصفحة التي تسهل التنفيذ.

  1. application_beginrequest: تفويض إنشاء datacontext.
  2. application_endrequest: تفويض التخلص من datacontext.

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

يمكن لجميع كائنات طبقة الوصول إلى البيانات أو المستودعات استدعاء SessionFactory للحصول على سياق البيانات الحالي.

رمز Global.asax يشبه هذا:


public static ISessionFactory SessionFactory { get; private set; }

void Application_Start(object sender, EventArgs e)
{
           SessionFactory = new SessionFactory();
}

void Application_BeginRequest(object sender, EventArgs e)
{
    var session = SessionFactory.OpenSession();
}

void Application_EndRequest(object sender, EventArgs e)
{
    SessionFactory.DisposeSession();
} 

نصائح أخرى

أبسط شيء يجب القيام به هو التخلص من datacontext في أقرب وقت ممكن. ومع ذلك ، يمكنك الاحتفاظ بنص DataContext طالما أردت ، طالما أنك على استعداد للتعامل مع الصداع الذي سيسبب.

مثل أشياء كثيرة ، فإن الجواب هو "يعتمد" ويعتمد على الموقف. لا توجد إجابة واحدة.

بالنسبة لتطبيقات الويب ، يعد الاحتفاظ بنص DataContex من أجل حياة طلب الويب بشكل مستقيم بشكل عام إلى الأمام بشكل عام للتعامل معه.

أود أن أقترح عليك أن تبدأ مع عمر صغير ثم تزيد من العمر في المواقف التي تحتاج فيها إلى التخزين المؤقت وغيرها من الفوائد من DataContexts مدى الحياة.

كتب أليكس جيمس مقال جيد عن هذا. في ذلك ، يلاحظ أنك بحاجة إلى مراعاة:

  • ازالة
  • تكلفة البناء
  • استخدام الذاكرة
  • السلامة الموضوع
  • عدم وجود جنسية
  • حياة محدودة طبيعية
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top