BestPractice: كيفية عرض ارتباط العديد من العدد بطريقة نظيفة؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

أنا أستخدم nhibernate ولدي علاقة كثيرة بين الموظف وفريق.

الآن أريد أن أعرض جميع الموظفين باسم عضو الفريق.

احتمال 1:

  • باستخدام السيارات وإنشاء DTO يحتوي على خصائص الموظف واسم الفريق (حريص على تحميل الفريق)
  • عرض DTO في العرض

احتمال 2:

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

احتمال 3:

  • كاحتمالات 1 و 2
  • باستخدام DTO لتوظيف التوظيف

احتمال 4:

  • استخدام acriteria API
  • استخدم AliastoBeanResultTransformer (لم يستخدم هذا)

احتمال 5:

  • استخدم linq إلى nhibernate
  • أعتقد أنني سأظل بحاجة إلى كيان التوظيف (وهو الآن ليس في نموذج النطاق الخاص بي)

ما هي أفضل الممارسات لهذه المشكلة؟

أي اقتراحات أخرى؟

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

المحلول

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

<table>
    <thead>
        <tr>
            <td>Employee</td>
            <td>Team</td>
        </tr>
    </thead>
    <% foreach(var employee in Model.Employees) { %>
        <% foreach (var team in employee.Teams) { %>
            <tr>
                <td><%=employee.Name %></td>
                <td><%=team.Name %></td>
            </tr>
        <% } %>
    <% } %>
</table>

يمكنك استخدام ViewModel (DTO) في الظروف التالية -

  • إذا كان نموذج المجال معقدًا للغاية ويساعد التبسيط على قابلية القراءة
  • إذا كنت بحاجة إلى القيام ببعض تعديلات البيانات قبل العرض
  • إذا كنت بحاجة إلى تحديث القيم على Postback.

سأتجنب الخيار الثاني لأنه يضيف فقط التعقيد غير المحدد (من ما يمكنني استنتاجه من المعلومات الحالية المقدمة) إلى مجالك :-)

تحديث

إذا كنت ترغب في الحصول على موظف بدون فرق لا يزال من الممكن عرضه ، فيمكنك تعيين هذا في العرض ...

<table>
    <thead>
        <tr>
            <td>Employee</td>
            <td>Team</td>
        </tr>
    </thead>
    <% foreach(var employee in Model.Employees) { %>
        <tr>
            <% if (employee.Teams.Any()) { %>
                <td><%=employee.Name %></td>
                <td> - </td>
            <% } else { %>
                <% foreach (var team in employee.Teams) { %>
                    <td><%=employee.Name %></td>
                    <td><%=team.Name %></td>
                <% } %>
            <% } %>
        </tr>
    <% } %>
</table>

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

نصائح أخرى

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

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

قم بإنشاء عرض DTO مع الحقول التي تريد عرضها كخصائص. باستخدام Automapper - قم بتخطيط خصائص الكيان إلى DTO الجديدة:

Mapper.CreateMap<Obj1, NewObjDto>()
                .ForMember(dest => dest.Prop1, opt => opt.MapFrom(src => src.Obj1.Prop1));

بمعنى آخر - عرضك لا يجب أن يشبه كائنات المجال الخاصة بك.

دبليو: //

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