نحوه ی Overload نمودن متد ها در سرویس های WCF
  در این ترفند به بررسی مشکلی می پردازیم که هنگام Overload نمودن متدها در سرویس های WCF بوجود می آید.
   WCF
   ۱۶۳۵۹
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۸/۱۲/۲۱
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

Overload نمودن متدها امری شایع در برنامه نویسی می باشد. این موضوع در مورد سرویس های WCF نیز صادق می باشد.

به مثال زیر توجه فرمایید.

[ServiceContract]

public interface IService

{

    [OperationContract]

    int Add(int first, int second);

 

    [OperationContract]

    double Add(double first, double second);

}

در قطعه کد بالا دو متد نوشته شده است که وظیفه آن ها جمع نمودن دو عدد از نوع int و double می باشد. در حالت عادی این قطعه کد هیچ مشکلی ندارد ولی اگر سرویس بالا را اجرا نمایید، با خطایی مشابه زیر مواجه خواهید شد.

Cannot have two operations in the same contract with the same name, methods Add and Add in type IService violate this rule. You can change the name of one of the operations by changing the method name or by using the Name property of OperationContractAttribute.

مشکل از اینجا ناشی می شود که در سرویس های WCF امکان Overload نمودن متدها (در حقیقت نوشتن چند متد با نام یکسان) بدین شکل وجود ندارد. برای رفع این مشکل باید از خصوصیت Name مربوط به OperationContract استفاده نمود.

قطعه کد بالا را به شکل زیر تغییر می دهیم.

[ServiceContract]

public interface IService

{

    [OperationContract(Name="AddInt")]

    int Add(int first, int second);

 

    [OperationContract(Name = "AddDouble")]

    double Add(double first, double second);

}

همانطور که ملاحظه می کنید ما به صفت Name مربوط به OperationContract نام مورد نظر خود را نسبت داده ایم و در نتیجه سرویس مورد نظر ما بدون هیچ مشکلی اجرا شده و کلاینت نیز می تواند مشابه زیر از سرویس ما استفاده نماید.

ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();

 

int intSum = client.AddInt(50, 25);

double doubleSum = client.AddDouble(10.5, 2.5);

 

client.Close();