أي واحد تفضل البحث / الإبلاغ عن DataTable أو DTTO أو فئة المجال؟

StackOverflow https://stackoverflow.com/questions/392806

سؤال

يتطلب المشروع حاليا أنا أعمل في صفحات Searhing / تصفية. على سبيل المثال، لدي صفحة بحث مجففة للحصول على مشكلات عن طريق البيانات أو الفئة أو الوحدة ...

إصدار فئة المجال معقدة وتحتوي على الكثير من كائنات القيمة والأشياء الطفل.

أنا أتساءل كيف يتعامل الناس مع البحث / التصفية / الإبلاغ عن UI. بقدر ما أعرف أن لدي 3 خيارات ولكن لا شيء منهم يجعلني أكثر سعادة.

1.) إرسال المعلمات إلى مستودع / DAO للحصول على DataTable و BIND DataTable إلى UI Controls.for مثال على ASP.NET GridView

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

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

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

2.) إرسال المعلمات إلى مستودع / DAO للحصول على DTO وربط DTO عناصر التحكم في UI.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

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

3.) إرسال المعلمات إلى فئة مستودع حقيقية للحصول على كائنات المجال المبنية بالكامل.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

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

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

أي واحد تفضله؟ أو أفعل ذلك خطأ؟ هل هناك أي اقتراحات أو طريقة أفضل للقيام بذلك؟

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

المحلول

لدي بعض الاقتراحات، ولكن بالطبع الجواب الشامل هو "ذلك يعتمد".

أولا، يجب أن تستخدم أداة Orm أو يجب أن يكون لديك سبب وجيه للغاية لعدم القيام بذلك.

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

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

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

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

نصائح أخرى

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

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

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

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

حتى لفه، # 3 هو الخيار الأفضل من الناحية الفنية، ولكن # 2 ربما هو الخيار الأكثر واقعية وقابلة للحياة عند النظر في الوقت والجودة معا لاحتياجات التقارير المعقدة والبحث.

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