كيفية تصميم DAOs عندما يختلف مصدر بيانات حيوي

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

  •  21-08-2019
  •  | 
  •  

سؤال

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

وطلب يحمل خصائص منطقية، في وقت لاحق يمكن استخدامها لاسترداد اتصال DB الطلب.

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

وحل واحد هو لتخزين مصدر البيانات على موضوع المحلي، ولكن أنا لا أحب العبث مع المتغيرات المحلية موضوع.

وثمة خيار آخر هو أن يكون هناك طريقة تهيئة على الكائن منطق الأعمال التي تدعو تهيئة على DAO مع خصائص الطلب.

وأنا أعتقد أنها مشكلة شائعة، يمكن أن تشير إلى حل مشترك؟

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

المحلول

وهذا يبدو وكأنه مشكلتك هي أنك تقوم بإنشاء مثيل DAO واحد للتطبيق الخاص بك. تحتاج إما إلى إنشاء نسخة منفصلة لكل مصدر بيانات (ربما جعل نوعا من وحدة تحكم داو لإدارة كل شيء من أجلك) أو ربما السماح أساليب الاتصال في داو لتكون ثابتة وتمرير كافة المعلومات حول كيفية الاتصال إلى مصدر البيانات جنبا إلى جنب مع البيانات التي يتم مترسخاً في كل طريقة.

نصائح أخرى

والمشكلة هي مربكة قليلا. ومن شأن وجود الوصول DAO واحدة متعددة datasources مختلفة يبدو أن كابوس الصيانة. ونتيجة لذلك، يجب أن تحدد واجهة DAO واحدة تحتوي على جميع الطرق التي تريد الاتصال به. لكل قاعدة البيانات التي تتصل أود أن بناء طبقة جديدة التي تطبق واجهة DAO الخاصة بك. هذا يسمح لك أن تطبيقات متعددة. وأود أن ثم تخزين هذه التطبيقات (كل الذي لديه مصدر البيانات الخاصة به) في مخطط (java.util.Map)، وذلك باستخدام بك "خصائص منطقية" كمفتاح إلى الخريطة. منذ كافة تطبيقات DAO الخاص بتنفيذ واجهة الخاص بك سوف تكون قادرة على طرحهم إلى واجهة واستخدامها بالتبادل. على الكائن عملك، هل حقن خريطة تطبيقات DAO. آمل أن يساعد هذا التصميم الخاص بك.

وأنت قد ترغب في النظر في هذه الفئة:

HTTP: //static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

وهذا سيجعل من السهل على كائنات خدمة وكائنات الوصول إلى البيانات لتكون جاهل أن أي فكرة datasources ديناميكية موجودة.

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

وهو مفصل نهج مماثل في هذه بلوق الدخول من فريق الربيع:

http://blog.springsource.com/2007/01 / 23 / دينامية مصدر البيانات-التوجيه /

وكان لي مثل هذه المشكلة على المشروع العميل / الخادم. مشاريع العميل والخادم وتقاسم اجهات داو. وعندما كنت تفعل عملية قاعدة البيانات واضطررت الى اختيار تنفيذ داو مناسبة. وكان بلدي حل مثل هذا:

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

واحصل داو من مصنع عن طريق تمرير parameters.Inside داو المصنع الذي يقرر داو تنفيذ للعودة ..

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

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