سؤال

أنا أحاول يكون ReportHandler الخدمة للتعامل مع تقرير الخلق.التقارير يمكن أن يكون متعددة ، واختلاف عدد من المعلمات التي يمكن تعيينها.في النظام حاليا هناك العديد من الطرق المختلفة لإنشاء التقارير (MS "خدمات التقارير" html التقارير ، ... الخ) و الطريقة يتم توليد البيانات لكل تقرير مختلف.أنا أحاول دمج كل شيء في ActiveReports.لا أستطيع تغيير النظام وتغيير المعلمات ، وذلك في بعض الحالات سوف أساسا على جملة where لتوليد النتائج ، وفي حالة أخرى سوف تحصل على مفتاح/قيمة أزواج أنني يجب أن تستخدم لتوليد النتائج.فكرت باستخدام نمط مصنع ، ولكن بسبب عدد مختلف من الاستعلام المرشحات هذا لن يعمل.

أنا أحب أن يكون واحد ReportHandler التي من شأنها أن تأخذ المدخلات المختلفة وبصق التقرير.عند هذه النقطة أنا لا أرى أي وسيلة أخرى من استخدام التبديل كبيرة بيان للتعامل مع كل تقرير على أساس reportName.أي اقتراحات كيف يمكن حل هذا أفضل ؟

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

المحلول

من الوصف الخاص بك, إذا كنت تبحث عن النمط الذي يطابق أفضل من المصنع ، في محاولة استراتيجية:

نمط استراتيجية

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

على أمل أن يساعد!

نصائح أخرى

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

public class ReportContainer{
          public ReportContainer ( IReportEngine reportEngine, IStorageEngine storage, IDeliveryEngine delivery...)
}
}

/// In your service layer you resolve which engines to use
// Either with a bunch of if statements / Factory / config ... 

IReportEngine rptEngine = EngineFactory.GetEngine<IReportEngine>( pass in some values)

IStorageEngine stgEngine = EngineFactory.GetEngine<IStorageEngien>(pass in some values)

IDeliverEngine delEngine = EngineFactory.GetEngine<IDeliverEngine>(pass in some values)



ReportContainer currentContext = new ReportContainer (rptEngine, stgEngine,delEngine);

والمندوبين ثم ReportContainer تعمل على محركات تعتمد ...

وكان لدينا مشكلة مماثلة، وذهبت مع مفهوم "الروابط" التي هي واجهات بين تطبيق تقرير المولد الرئيسي ومحركات تقرير مختلفة. وعند القيام بذلك، كنا قادرين على إنشاء تطبيق "ملقم تقرير عالمي". يجب عليك التحقق من ذلك في www.versareports.com.

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