سؤال

لقد رأيت طريقتين مختلفتين يتبعهما المبرمجون عند إنشاء سياق كيان في التعليمات البرمجية الخاصة بهم.

الأول يشبه هذا، ويمكنك العثور عليه في جميع أمثلة كود MSDN:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

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

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

ما هي الطريقة الأكثر كفاءة؟

افترض أن لديك طريقتين، واحدة تسمى DoSomething1() والأخرى تسمى DoSomething2()، وكلا الطريقتين تتضمن عبارة الاستخدام لفتح السياق والقيام بأي شيء به.إذا كنت ستستدعي أسلوبًا تلو الآخر، فهل سيكون هناك أي حمل زائد عن الحاجة، نظرًا لأن كلا الطريقتين تقومان بإنشاء السياق ثم تنظيفه عند الانتهاء؟بدلاً من وجود سمة خاصة واحدة فقط يتم إنشاؤها عند إنشاء كائن فئة، ثم يتم تنظيفها بدورها عندما يخرج الكائن عن النطاق؟

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

المحلول

إن إنشاء ObjectContext جديد في كل مرة ينطوي على حمل "بعض".يتمثل الحمل الأساسي في نسخ بيانات التعريف من ذاكرة التخزين المؤقت العامة إلى بيانات تعريف مرتبطة بـ ObjectContext المحدد.

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

بالنسبة لي، يعتمد الخيار الذي تختاره على أشياء مثل:

  1. ما هي المدة التي من المحتمل أن تكون فيها فئة التفاف الخاصة بك؟إذا كان يعيش لفترة طويلة ، فقد ينمو ObjectContext لعقد الكثير من الكيانات التي تبطئ بمرور الوقت.لذلك قد يكون نص كائن جديد في كل مرة فكرة جيدة.
  2. هل المكالمات إلى الأساليب في فئة التغليف الخاصة بك متزامنة؟فئة ObjectContext نفسها ليست مؤشرات الترابط ، لذا إذا كنت تستخدم النمط الثاني ، فأنت بحاجة إلى التأكد من أن فئة / مستودع التغليف الخاص بك آمن إذا كنت تتوقع أن تتصل به عدة مؤشرات ترابط.
  3. هل الأساليب غير ذات صلة بشكل أساسي؟إذا كان الأمر كذلك، فقد تحصل على آثار جانبية غير متوقعة إذا كانت تشترك في سياق واحد بين الطرق.

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

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

تحديث:لقد أخذت الوقت الكافي لتجميعها إجابة أكثر اكتمالا

نصائح أخرى

وأما الخيار الثاني في الواقع لا تنظيف بعد نفسها إذا كان هذا هو ما تعنيه. انا افضل لاستخدام ObjectContext نسخة في كل مرة لأنني لم يكن لديك للتخلص منه بعد. لست متأكدا حصلت على السؤال على الرغم من الحق ... كثيرة جدا ساعات البرمجة اليوم.

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

وبعد ذلك لاستخدام هذا المستودع أفعل شيئا مثل:

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top