سؤال

ما هو كائن نقل البيانات؟

في MVC هي فئات النموذج DTO، وإذا لم يكن الأمر كذلك، فما هي الاختلافات وهل نحتاج إلى كليهما؟

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

المحلول

كائن نقل البيانات هو كائن يُستخدم لتغليف البيانات وإرسالها من نظام فرعي لتطبيق إلى آخر.

يتم استخدام DTOs بشكل شائع بواسطة طبقة الخدمات في تطبيق N-Tier لنقل البيانات بينها وبين طبقة واجهة المستخدم.الفائدة الرئيسية هنا هي أنه يقلل من كمية البيانات التي يجب إرسالها عبر السلك في التطبيقات الموزعة.كما أنهم يصنعون نماذج رائعة في نمط MVC.

يمكن استخدام آخر لـ DTOs وهو تغليف المعلمات لاستدعاءات الطريقة.يمكن أن يكون هذا مفيدًا إذا كانت الطريقة تأخذ أكثر من 4 أو 5 معلمات.

عند استخدام نمط DTO، يمكنك أيضًا الاستفادة من مجمعات DTO.يتم استخدام المجمعات لإنشاء DTOs من كائنات المجال، والعكس صحيح.

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

نصائح أخرى

وتعريف لDTO ويمكن الاطلاع على الموقع مارتن فاولر . تستخدم DTOs لنقل المعلمات إلى أساليب وعن أنواع العودة. وهناك الكثير من الناس استخدام تلك في واجهة المستخدم، ولكن آخرين تضخيم كائنات المجال منها.

وA DTO هو كائن البكم - انها تحمل فقط خصائص ولها حاصل على واضعي، ولكن أي منطق آخر من أي معنى (عدا ربما مقارنة () أو يساوي () التنفيذ)

.

وعادة الطبقات نموذج في MVC (على افتراض صافي MVC هنا) وDTOs، أو مجموعات / مجاميع من DTOs

على العموم كائنات القيمة يجب أن تكون غير قابلة للتغيير.يحب عدد صحيح أو خيط الكائنات في جافا.يمكننا استخدامها لنقل البيانات بين طبقات البرنامج.إذا كانت طبقات البرنامج أو الخدمات تعمل في عقد بعيدة مختلفة كما هو الحال في بيئة الخدمات الصغيرة أو في تطبيق Java Enterprise القديم.يجب علينا عمل نسخ طبق الأصل تقريبًا من فئتين.هذا هو المكان الذي التقينا فيه بـ DTOs.

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

في أنظمة Java Enterprise Systems القديمة، يمكن أن تحتوي DTOs على العديد من عناصر EJB.

لا أعلم أن هذه أفضل ممارسة أم لا ولكنني شخصيًا أستخدمها كائنات القيمة في مشاريع Spring MVC/Boot الخاصة بي مثل هذا:

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|

مراقب الطبقة لا تعرف ما هي الكيانات.ويتواصل مع استمارة و عرض كائنات القيمة.تحتوي كائنات النموذج على تعليقات توضيحية للتحقق من صحة JSR 303 (على سبيل المثال @NotNull) و عرض كائنات القيمة لديك تعليقات جاكسون التوضيحية للتسلسل المخصص.(على سبيل المثالJsonIgnore)

تتواصل طبقة الخدمة مع طبقة المستودع عبر استخدام كائنات الكيان.تحتوي كائنات الكيان على تعليقات توضيحية لبيانات JPA/Hibernate/Spring.تتواصل كل طبقة مع الطبقة السفلى فقط.الاتصال بين الطبقات محظور بسبب التبعية الدائرية/الدورية.

User Service ----> XX CANNOT CALL XX ----> Order Service

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

على سبيل المثال، هذا هو كيان المستخدم الخاص بنا:

@Entity
public final class User {
    private String id;
    private String firstname;
    private String lastname;
    private String phone;
    private String fax;
    private String address;
    // Accessors ...
}

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

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

يمكنك بسهولة الحصول على النتيجة المرقّمة من طبقة المستودع.بفضل الربيع، يمكنك أيضًا استخدام واجهات العرض فقط.

List<UserListItemView> find(Pageable pageable);

لا تقلق بشأن عمليات التحويل الأخرى BeanUtils.copy الطريقة تعمل بشكل جيد.

  1. بالنسبة لي أفضل إجابة على السؤال ما هو DTO هل هذا تعد DTO كائنات بسيطة لا ينبغي أن تحتوي على أي منطق عمل أو تنفيذ أساليب يتطلب الاختبار.
  2. عادةً ما يكون النموذج الخاص بك (باستخدام نمط MVC) نماذج ذكية، ويمكن أن يحتوي على الكثير من/بعض الأساليب التي تقوم ببعض العمليات المختلفة لهذا النموذج على وجه التحديد (وليس منطق الأعمال، يجب أن يكون هذا في وحدات التحكم).ومع ذلك، عند نقل البيانات (على سبيل المثال.استدعاء الراحة (GET/POST/مهما كان) نقطة النهاية من مكان ما، أو استهلاك خدمة ويب باستخدام SOA، وما إلى ذلك...) لا تريد إرسال كائن كبير الحجم برمز غير ضروري لنقطة النهاية، وسوف يستهلك البيانات، ويبطئ عملية النقل.

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

ويكيبيديا :

<اقتباس فقرة>   

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

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