سؤال

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

  1. الدولة يتم تحميلها من خلال مخطط
  2. مخطط يصل حريصة الملكية البلد
  3. مخطط يسترد البلاد على تلك الدولة
  4. مخطط الأحمال البلاد
  5. مخطط يصل حريصة جمع العقار من الدول
  6. مخطط الأحمال قائمة الدول ويبدأ في رسم كل واحد باستخدام ذاكرة التخزين المؤقت حيث أنها يمكن أن.
  7. غوتو 1 لكل دولة تحميلها في البلد

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

شكرا مقدما!

تحرير:

حسنا بعد ما مات هاولز المشورة التحقيق أعمق في datamapper نمط مارتن فاولر لا بل أتكلم عن دوري مرجعية على صفحة 169 و 170.اقتراحه هو استخدام كائن فارغ وتحميله في هوية خريطة العودة وبالتالي وقف متكررة التحميل.لقد قرأت هذه الفقرة حوالي 1000 مرات حتى الآن وأنا ما زلت لا أفهم كيف هذا يتوقف الحمل وما بعدها أنني فقدت متى أو كيف لي أن أعرف عندما لتحميل هذا الكائن فارغة إلى هويتي الخريطة.أعتذر عن كونها كثيفة هنا, ولكن هذا فقط يبدو أن تطير فوق رأسي.

شكرا مرة أخرى.

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

المحلول

النظر في تحميل الأشياء من خلال مستودع التي يحتفظ من الكائنات التي تم تحميلها.

تحرير:إذا كنت تفعل الخاصة بك ORM (وحتى لو كنت لا) أنا أوصي مارتن فاولر كتاب أنماط من تطبيق المشاريع المعمارية.أنا بالكاد يذكر له الحديث عن هذه الحلقة الحالة في الكتاب لذلك قد تساعدك.

تحرير 2:في الخطوات 4 و 5 من حلقة الخاص بك إذا كان لديك بالفعل تحميل البلاد ثم ليست هناك حاجة إلى بفارغ الصبر الحمل الدول لأنها يجب أن تكون بالفعل تحميلها.هذا يكسر حلقة لا نهائية.

نصائح أخرى

على datamapper ينبغي أن قبض المراجع الدائرية.هل هي نابعة datamapper?

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

هنا هو بلدي FetchDepthCounterClass تم إنشاؤها:

public static class FetchDepthCounter
{
    private static Dictionary<Type, int> _DepthCounter;
    private static int _MaxDepth = 3;

    static FetchDepthCounter()
    {   
        _DepthCounter = new Dictionary<Type, int>();
    }

    public static void SetDepth(int depth)
    {
        _MaxDepth = depth;
    }

    public static void ResetCounter()
    {
        _DepthCounter.Clear();
    }

    public static bool IncrementCounter(Type entityType)
    {
        if(!_DepthCounter.ContainsKey(entityType))
        {
            _DepthCounter.Add(entityType, 0);
            return true;
        }

        if(_DepthCounter[entityType] < _MaxDepth)
        {
            ++_DepthCounter[entityType];
            return true;
        }

        return false;
    }

}

IncrementCounter يعود منطقي تفيد ما إذا كان ماكس جلب عمق تم التوصل إليه أم لا.أدعو زيادة العداد كجزء من عملية رسم الخرائط قبل ان تعيين قيمة الخاصية.أولا تحديد ما أنا الحاجة إلى تحميل آخر DTO كائن أو مجموعة من DTOs وأنا تمرير الأم نوع و زيادة على هذا النوع.لذلك هذا هو صغير قليلا من التعليمات البرمجية داخل SetValue الأسلوب في datamapper:

if(isDto)
{
    if (!FetchDepthCounter.IncrementCounter(property.ComponentType))
        return;
}

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

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