سؤال

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

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

ما هي أفكارك حول حالة الاستخدام الشائع هذه؟كيف يمكنك حل هذا؟

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

المحلول

يجب على وحدة التحكم تمرير المعرف إلى طبقة الخدمة ثم استعادة كل ما هو مطلوب لعرض بقية استجابة HTTP.

لذا -

Map<String,Object> doGet (@RequestParam("id") int id) {
     return serviceLayer.getStuffByDomainObjectId(id);
}

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

public Map<String,Object> getStuffByDomainObjectId(int id) {
    DomainObject domainObject = dao.getDomainObjectById(id);
    domainObject.businessLogicMethod();
    return domainObject.map();
}

نصائح أخرى

في مشروع خاص بي استخدمت طبقة الخدمة:

class ProductService {

    void removeById(long id);

}

أعتقد أن هذا يعتمد على ما إذا كانت الخدمة بعيدة أم محلية.كقاعدة عامة، أحاول تمرير المعرفات حيثما أمكن ذلك إلى الخدمات البعيدة ولكني أفضّل الكائنات على الخدمات المحلية.

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

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