سؤال

لقد كنت أذهب عبر البرامج التعليمية (على وجه التحديد باستخدام LinQ-To-Liquation) وأفهم المفاهيم الأساسية، لكن بعض الأشياء تعطيني مشكلات.

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

لطريقة البريد، الطريقة المعتادة لأداء عمليات CRUD

entities.AddToTableSet(myClass);
entities.SaveChanges();

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

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(int id, [Bind(Exclude = "Id")] ClassA classA,
                        [Bind(Exclude = "Id")]ClassB classB)
{
   // Validation occurs here

   if(!ModelState.IsValid)
      return View();

   try
   {
      _someRepositoryOrService.Add(id, classA, classB);
      return RedirectToAction("Index", new { id = id });
   }
   catch(Exception ex)
   {
      // Logging and exception handling occurs here
   }
}


public void Add(int id, ClassA classA, ClassB classB)
{
    EntityA eA = new EntityA
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    EntityB eB = new EntityB
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    _entity.AddToEntityASet(eA);
    _entity.AddToEntityBSet(eB);
    _entity.SaveChanges();
}

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

تحرير: أنا قلق أيضا من هذا النهج لأنه يتطلب منشئين فارغين للقيام باستفسارات LINQ بشكل صحيح بسبب رسالة الخطأ هذه:

فقط منشئون المعلمات والتهائم معتمدون في Linq إلى الكيانات.

هذه ليست مشكلة كبيرة لأنني نادرا ما أحتاج إلى المنطق Int

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

المحلول

_someRepeserService.add (ID، Classa، Classb)؛

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

الولاية العامة إضافة (ID ID، Classa Classa، Classb Classb)

يكسر فصل الشواغل (SOC). إنه ينفذ مهمتين:

  1. عرض الخريطة البيانات في كيانات
  2. حفظ إلى مستودع

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

تحقق أيضا هذا ممتاز بريد بواسطة جيمي بوغارد (مؤلف مشارك في ASP.NET MVC في العمل) حول ViewModels. قد يساعدك ذلك على أتمتة الخرائط. كما أنه يقترح تقنية عكسية - اصنع وحدات التحكم الخاصة بك تعمل مع الكيانات وليس المشاهد! مرشحات الإجراءات المخصصة والرسومات النموذجية هي حقا مفتاح القضاء على الروتين الذي لا ينتمي حقا إلى وحدات تحكم بل تفاصيل البنية التحتية بين العرض والتحكم. علي سبيل المثال، هناكيف يمكنني أتمتة إعادة استخدام الكيانات. هناكيف أرى ما يجب أن تفعله وحدات تحكم.

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

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

يجب أن تتم الخطوة الأولى في المستودع، وهذا صحيح - إلا أن التعيين من ClassX إلى Entityex لا ينتمي إلى تلك الخطوة. إنه يتعلق بالقلق - البنية التحتية. انظر على سبيل المثال هذه سؤال حول رسم الخرائط، ولكن بشكل عام إذا كان لديك طبقتين (واجهة المستخدم والمستودعات) لا ينبغي أن يهتمون بالتعيين - يجب على خدمة Mapper / Helper. بجانب مدونة جيمي، يمكنك أيضا قراءة ASP.NET MVC في العمل أو ببساطة إلقاء نظرة على codecampserver. لكيفية التعيين مع واجهات IENTITYMAPPER مرت إلى منشئين المراقبين (لاحظ أن هذا نهج أكثر دليلا وأقل من العمل الذي جيمي بوغارد).

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

نصائح أخرى

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

هذه القضايا ليست بالضرورة حقا مرتبطة ASP.NET MVC بأي شكل من الأشكال. يعطي ASP.NET MVC أساسا أي إرشادات حول كيفية القيام بالوصول إلى النموذج / البيانات الخاص بك ومعظم العينات والبرامج التعليمية ل ASP.NET MVC ليست إنتاج تطبيقات نموذجية تستحق الإنتاج، ولكن حقا ضئيلة فقط عينات.

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

في النهاية، تقوم باستخدام إطار الكيان في الغالب كمولد رمز لا يولد رمز مفيد للغاية وبالتالي قد ترغب في النظر في مولدات أو أطر أو أطر أو أطر أخرى تتطابق بشكل وثيق بمتطلباتك.

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