سؤال

ولقد علمت أن لديها المفرد تحميل كسول، وهذا هو نمط الاستخدام:

private MyObject()
{
}

public static MyObject Instance
{
    get { return SingletonCreator.CreatorInstance; }
}

private static class SingletonCreator
{
    private static readonly MyObject _instance = new MyObject();

    public static MyObject CreatorInstance
    {
        get { return _instance; }
    }
}

ولكن هل نمط أكثر بساطة هي:

private static readonly MyObject _instance = new MyObject();

private MyObject()
{
}

public static MyObject Instance
{
    get { return _instance; }
}

وهذا لن يكون تحميل كسول. ولكن هل هذا حقا شيء أنني يجب أن تهتم عنها في تطبيق ويب؟

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

المحلول

واذا لم يكن أساليب ثابتة والتي لا تحتاج إلى المفرد، تماما بما في ذلك منشئ ثابت ما يكفي لجعل الطبقة كسول. دون المنشئ ثابت انها لا تزال <م> في الغالب كسول.

المفرد الصفحة تنفيذ للحصول على مزيد من التفاصيل والخيارات.

وكنت عادة الرمز الذي قدم في الجزء السفلي من السؤال - انها كسول بما فيه الكفاية، إلا إذا كنت <م> حقا لا يريدون تهيئة المفرد ما لم يحدث لاستخدامها. (أساسا مع مجموعة beforefieldinit، فإن JIT جعل عموما على يقين من أن كل نوع المستخدمة في طريقة تتم تهيئة، وبدون beforefieldinit عليها أن تنتظر حتى الاستخدام الفعلي الأول من الطبقة أثناء التنفيذ بي <لأ href = "HTTP: //. pobox.com/~skeet/csharp/beforefieldinit.html "يختلط =" نوفولو noreferrer "> الصفحة beforefieldinit للحصول على مزيد من المعلومات - ولكن النقطة المهمة هي أنه لا يزال لن تهيئة جميع الأوراق الوحيدة في أقرب وقت كما هو التجمع تحميل، أو أي شيء من هذا القبيل).

نصائح أخرى

وعادة ما يعني

وكسلان تحميل أنك تحميل بتكاسل شيء من قاعدة بيانات. ما تفعلونه عادة ما يسمى " كسول التهيئة " (من الناحية الفنية "التهيئة كسول" هو طريقة تنفيذ نمط تحميل كسول).

وأما بالنسبة للأسئلة الأصلية: أولا، أنت لا تحتاج إلى المفرد. إذا كنت <م> لا تزال في حاجة إليها، من هنا كيف هذا وينبغي أن يتم بشكل صحيح. ثالثا، لا تحتاج إلى المفرد.

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

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

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

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

وتأكد من عدم الخلط بين تحميل الصفحة، الدورة وعمر التطبيق. وقال، هل أنت متأكد أنك تريد استخدام مثيل مفرد ثابت؟ وبمجرد إنشاء، وسوف يعيش حتى التطبيق (خادم) هو إيقاف أو تشغيل <م> IISRESET .

والنظر في التخزين المؤقت في HttpContext.Current.Items بدلا من ذلك إذا كنت تريد واحدة سبيل المثال تحميل بتكاسل في تحميل الصفحة، أو ربما في HttpContext.Current.Session إذا كنت تريد واحدة لكل مستخدم.

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