۱۳۸۹/۰۵/۱۸

مديريت بهتر كدهاي توليد شده توسط WCF RIA Services


در حين كار با WCF RIA Services اگر تمام موجوديت‌هاي تعريف شده انتخاب شوند يك فايل طويل DomainService حاصل خواهد شد. كار كردن با اين فايل نه زيبا است و نه ساده. بعد از يك مدت شايد بگوئيم، خوب! من به ازاي هر جدول يك DomainService جدا توليد مي‌كنم با نامي مختص به آن و اين اطلاعات را در فايلي جداگانه نيز ذخيره خواهم كرد. پس از انجام اينكار با خطاي زير مواجه خواهيم شد:

The entity type ... is exposed by multiple DomainService types. Entity types cannot be shared across DomainServices

به صورت خلاصه: مهم نيست سيستم شما از چند جدول تشكيل شده است؛ مهم اين است كه تنها يك فايل DomainService را بايد توليد كنيد و البته اين يك محدوديت نيست؛ يك هدف محسوب مي‌شود؛ از اين ديدگاه كه موجوديت‌هاي مرتبط بايد در يك Domain قرار گيرند و تنها در يك دومين هستند كه روابط بين آن‌ها معنا پيدا مي‌كند.
- روش توصيه شده براي مديريت اين كلاس DomainService طويل، استفاده از واژه‌ي كليدي partial است (براي مثال public partial class MyDomainService). به اين صورت هر موجوديت را مي‌توان در يك فايل جداگانه قرار داد و به اين ترتيب مديريت ساده‌تري را بر روي اطلاعات توليد شده داشت و همچنين تمامي اين فايل‌ها در نهايت يك كلاس واحد را تشكيل مي‌دهند و اصل وجود يك DomainService واحد در برنامه زير سؤال نخواهد رفت.
- كدهايي را كه خودتان نيز به اين مجموعه اضافه خواهيد كرد، در لابلاي كدهاي توليد شده قرار ندهيد. در صورت تغييري در جداول نياز است تا اين فايل‌ها مجددا توليد شوند و اينجا است كه تمام تغييرات خود را از دست خواهيد داد. براي اين منظور باز هم يك كلاس partial ديگر را تعريف كنيد تا كدهاي سفارشي خود را بتوان به صورت مجزايي از كدهاي توليد شده به صورت خودكار، در آن قرار داد (براي مثال به نام MyServiceNameDomainService.extensions.cs).
- جايي كه قرار است يك سري از فايل‌ها مجددا توليد شوند استفاده از برنامه‌هاي سورس كنترل را فراموش نكنيد؛ تا هر زماني بتوان كدهاي جديد را با كدهاي نگارش‌هاي قبل به سادگي مقايسه كرد؛ يا حتي به نگارش‌هاي قبلي بازگشت نمود.
- اين نكته را به خاطر داشته باشيد كه اگر اطلاعاتي به صورت خودكار از پيش تعريف شده و موجود است (كلاس دومين يا متاديتاي آن)،‌ اين اطلاعات حين استفاده از امكانات توليد كد خودكار، مجددا توليد نخواهند شد. به همين جهت بايد ابتدا آن‌ها را به صورت comment در آورد (يا از پروژه خارج نمود؛ استفاده از امكانات include و exclude پوشه‌ها يا فايل‌ها در ويژوال استوديو) تا همواره كدهاي آخرين اطلاعات موجود توليد گردند.