مدیریت تغییرات در سیستم های مبتنی بر WCF
نویسنده: مسعود پاکدل
تاریخ: ۱۳۹۲/۰۳/۰۲ ۱۵:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
[DataContract]
public class Book
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Name { get; set; }
} [ServiceContract]
public interface ISampleService
{
[OperationContract]
IEnumerable<Book> GetAll();
[OperationContract]
void Save( Book book );
}public class SampleService : ISampleService
{
public List<Book> ListOfBook
{
get;
private set;
}
public SampleService()
{
ListOfBook = new List<Book>();
}
public IEnumerable<Book> GetAll()
{
ListOfBook.AddRange( new Book[]
{
new Book(){Code=1 , Name="Book1"},
new Book(){Code=2 , Name="Book2"},
} );
return ListOfBook;
}
public void Save( Book book )
{
ListOfBook.Add( book );
}
} [DataContract]
public class Book
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Author { get; set; }
}[DataMember( IsRequired = true )]
public string Author { get; set; } [DataContract]
public class Book
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember( IsRequired = true )]
public string Author { get; set; }
[OnDeserializing]
private void OnDeserializing( StreamingContext context )
{
if ( string.IsNullOrEmpty( Author ) )
{
Author = "Masoud Pakdel";
}
}
}روش بعدی استفاده از اینترفیس IExtensibleDataObject است. بعد از اینکه کلاس Book این اینترفیس را پیاده سازی کرد مشکل Versioning Round Trip حل میشود. به این صورت که سرویس یا کلاینتی که نسخه قدیمی را میشناسد اگر نسخه جدید را دریافت کند خصوصیاتی را که نمیشناسد مثل Author در خاصیت ExtensionData ذخیره میشود و هنگامی که کلاس Book برای سرویس یا کلاینتی که نسخه جدید را میشناسد DataContractSerializer اطلاعات مورد نظر را از خصوصیت ExtensionData بیرون میکشد و کلاس Book جدید را باز سازی میکند. بررسی کلاس ExtensionData توسط خود DataContractSreializer انجام میشود و نیاز به هیچ گونه ای کد نویسی ندارد.
[DataContract]
public class Book : IExtensibleDataObject
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Author { get; set; }
public virtual ExtensionDataObject ExtensionData
{
get { return _extensionData; }
set
{
_extensionData = value;
}
}
private ExtensionDataObject _extensionData;
}public IEnumerable<Book> GetAll()
{
ListOfBook.AddRange( new Book[]
{
new Book(){Code=1 , Name="Book1", Author="Masoud Pakdel"},
new Book(){Code=2 , Name="Book2" },
} );
return ListOfBook;
}همان طور که میبینید این نسخه از کلاینت هیچ گونه اطلاعی از وجود یک خاصیت به نام Author ندارد ولی از طریق ExtensionData متوجه میشود یک خاصیت به نام Author به مدل سمت سرور اضافه شده است.
اما در صورتی که قصد داشته باشیم که یک سرویس خاص از همان نسخه قدیمی کلاس Book استفاده کند و نیاز به نسخه جدید آن نداشته باشد میتوانیم این کار را از طریق مقدار دهی True به خاصیت IgnoreExtensionDataObject در ServiceBehaviorAttribute انجام داد. بدین شکل
[ServiceBehavior( IgnoreExtensionDataObject = true )] public class SampleService : ISampleService