Data Contract و Known Type درWCF

جمعه 9 بهمن 1394

در این مقاله قصد داریم به شرح دو مفهوم مهم در WCF به نام های Known Type و DataContract می پردازیم .به همراه مقاله یک فایل ضمیمه ای قرار دارد که از این صفت ها استفاده شده است .

Data Contract و Known Type درWCF

برای شروع بهتر است راجع به مفاهیم اولیه صحبت کنیم .ابتدا سرویس را تعریف می کنیم. شما به عنوان برنامه نویس وب حتما در برنامه خود نیاز دارید که با درگاه بانک اطلاعی در ارتباط باشید و از سرویس های آن استفاده کنید .منظور از سرویس این است که برنامه ای دیتا و یا عملیات مورد نیاز شما را در جایی دیگر بر عهده بگیرد.درگاه بانک یک سرویس است .WCF فرم ورکی در استودیو دات نت است که جهت نوشتن برنامه هایی که قادر به ارائه سرویس هستند به کار می رود.

با کمک این فرم ورک می توانید بین برنامه های مختلف ارتباط برقرار کنید .در این ارتباط اشیا ساده مثلا یک رشته و یا اشیا پیچیده تر مانند یک کلاس و یا مجموعه می توانند جابه جا شوند .

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

در داخل wcf سه اصل اساسی داریم و آن هم Address,Binding,Contract است .در Address آدرس سرویس خود را می نویسیم در داخل Binding نحوه ای که قرار است برنامه ما به سرویس متصل شود را می نویسیم و  بخش Contract قراردادهایی که در داخل برنامه داریم را مشخص می کند.

قراردادهای مختلفی در WCF وجود دارد که به اختصار شرح می دهیم .

Service contracts این قرارداد مشخص می کند که چه عملیاتی قرار است در سرویس انجام شود .عموما در بالای کلاسی که اینترفیس سرویس را پیاده سازی کرده است گذاشته می شود .

Operation contract مشخص کننده توابعی است که توسط کاربران یا همان کلاینتی که قصد استفاده از سرویس را دارد دیده می شود .

Data contract برای مشخص کردن داده هایی است که بیرون از سرویس قابل دیدن هستند .این پراپرتی ها مانند پراپرتی های کلاس معمولی تعریف می شوند ولی کاربردی که Accessor های Set ,Get دارند برای Serialize و Deserialize کردن داده ها از داخل سرویس به بیرون و برعکس است .

Message contracts به صورت پیش فرض فرمت پیام ها SOAP است اما اگر مشتری فرمت دیگری را بخواهد WCF از آن پشتیبانی می کند .ولی باید در بالای پیامی که قصد مبادله آن را دارید از صفت Message contracts استفاده کنید .

بعد از بیان مفاهیم کلی به موضوع اصلی این مقاله باز می گردیم .قصد داریم بیان کنیم که DataContract چیست .و انواع آن کدام است .قرارداد و یا همان Contract اطلاعاتی راجع به سرویس WCF در اختیار ما قرار می دهد.انواع قراردادهایی که در این سرویس وجود دارند را در بالا ذکر کردیم .

حال سوالی که در اینجا مطرح می کنیم این است که Data Contract چیست ؟ این قرارداد برای تعریف داده هایی که در سمت کاربر قابل فهم است و یا قرار است به بیرون از سرویس به سمت کاربر ارسال شود ، استفاده می شود .اگر این قرارداد را نگذاریم هیچ دیتایی از بیرون سرویس قابل دستیابی نیست .در ضمن این قرارداد مسول serialize کردن و Deserialize کردن هم هست.یعنی اگر کاربری می خواهد داده ای که دریافت می کند از نوع Json باشد این کار بر عهده قرارداد Data Contract است .دو صفت تا حدی شبیه به هم داریم که در این جا لازم است تا تعریف شوند تا اشتباه گرفته نشوند .

DataContract Attribute

صفتی برای تعیین کردن دیتایی است که قرار است با بیرون از سرویس مبادله شود.در داخل DataContract Attribute هم برای اعضا یک صفت به نام DataMember Attribute در نظر می گیریم که این صفت برای پراپرتی ها در نظر گرفته میشود.کد زیر تفاوت این دو را به خوبی نشان می دهد.


    [DataContract]  
    public class Student  
    {  
        [DataMember]  
        public string Name  
        {  
            get;  
            set;  
        }  
        [DataMember]  
        public string Department  
        {  
            get;  
            set;  
        }  
        [DataMember]  
        public int Year;  
    }  

سرویس مورد نظر ما در اینجا به شکل زیر خواهد بود .


    [ServiceContract]  
    public interface IStudentService   
    {  
        [OperationContract]  
        Student GetStudent(string name);  
      
        [OperationContract]  
        void SaveStudent(Student student);  
    }  
      
    public class StudentService: IStudentService   
    {  
        public Student GetStudent(string name)  
        {  
            switch (name)  
            {  
                case "sakthi":  
                    return new Student  
                    {  
                        Name = "sakthi", Department = "MCA", Year = 3  
                    };  
                case "kumar":  
                    return new Student  
                    {  
                        Name = "sakthi", Department = "BCA", Year = 3  
                    };  
                default:  
                    return new Student  
                    {  
                        Name = name, Department = "BE", Year = 3  
                    };  
            }  
        }  
      
        public void SaveStudent(Student student)  
        {  
      
        }  
    }  

برای ساخت سرویس WCF به مقاله (مراحل ایجاد و استفاده از سرویس WCF)مراجعه کنید .حال سرویس ما آمده است .نام سرویس ما در اینجا StudentService است .در داخل App.config هم تغییرات زیر را اعمال می کنیم .

پروژه را اجرا کنید .برای اجرای پروژه باید بر روی Solution کلیک راست کرده و Properties را می زنیم .در این پنجره دو پروژه به نام های StudentServer و Client را بر روی Start  قرار می دهیم شکل زیر را ببینید

سرویس به داخل برنامه Client اضافه شده است .

در داخل کنسول برنامه client کدهای زیر را نوشته ایم

StudentServiceClient client = new StudentServiceClient();  
Student student = client.GetStudent("sakthi");  
Console.WriteLine("****** Student Detail ******");  
Console.WriteLine("****************************");  
Console.WriteLine("Student Name : " + student.Name);  
Console.WriteLine("Department : " + student.Department);  
Console.WriteLine("Year : " + student.Year);  
Console.ReadKey(); 

اگر این برنامه اجرا شود شکل زیر را خواهید دید .

برای این پروژه کلاسی که برای آن صفت Data Contract در نظر گرفته ایم به صورت زیر است .نام این کلاس Student Service است .


    [DataContract]  
    [KnownType(typeof(HostelStudent))]  
    public class Student  
    {  
        [DataMember]  
        public string Name   
        {  
            get;  
            set;  
        }  
        [DataMember]  
          
        public string Department  
        {  
            get;  
            set;  
        }  
        [DataMember]  
        public int Year;  
      
    }  
      
      
    [DataContract]  
    public class HostelStudent: Student  
    {  
        [DataMember]  
        public string RoomNumber  
        {  
            get;  
            set;  
        }  
    }  
      
    public class StudentService: IStudentService   
    {  
        public Student GetStudent(string name)   
        {  
            switch (name)   
            {  
                case "sakthi":  
                    return new HostelStudent   
                    {  
                        Name = "sakthi", Department = "MCA", Year = 3, RoomNumber = "A124"  
                    };  
                case "kumar":  
                    return new Student  
                    {  
                        Name = "sakthi", Department = "BCA", Year = 3  
                    };  
                default:  
                    return new Student  
                    {  
                        Name = name, Department = "BE", Year = 3  
                    };  
            }  
        }  
      
        public void SaveStudent(Student student)   
        {  
      
        }  
    }  

کدی که در داخل کنسول برنامه studentservice خواهیم نوشت به شکل زیر است

StudentServiceClient client = new StudentServiceClient();  
HostelStudent student = (HostelStudent) client.GetStudent("sakthi");  
if (student != null)  
{  
    Console.WriteLine("****** Student Detail ******");  
    Console.WriteLine("****************************");  
    Console.WriteLine("Student Name : " + student.Name);  
    Console.WriteLine("Department : " + student.Department);  
    Console.WriteLine("Year : " + student.Year);  
    Console.WriteLine("Hostel Room Number : " + student.RoomNumber);  
} 

اگر برنامه را اجرا کنید شکل زیر را خواهید دید

در WCF چهار روش برای شناسایی نوعی که قرار است رد و بدل شود وجود دارد که در اینجا به ذکر آنها می پردازیم .

استفاده از صفت KnownType


    [DataContract]  
    [KnownType(typeof(HostelStudent))]  
    public class Student   
    {  
        [DataMember]  
        public string Name  
        {  
            get;  
            set;  
        }  
        [DataMember]  
        public string Department  
        {  
            get;  
            set;  
        }  
        [DataMember]  
        public int Year;  
      
    }  
      
      
    [DataContract]  
    public class HostelStudent: Student  
    {  
        [DataMember]  
        public string RoomNumber  
        {  
            get;  
            set;  
        }  
    }  

استفاده از صفت ServiceKnownType

این صفت مشخص می کند که کلاسی که این صفت را دارد این تنها نوعی است که سرویس ما آن را می شناسد


    [ServiceContract]  
    [ServiceKnownType(typeof(HostelStudent))]  
    public interface IStudentService  
    {  
        [OperationContract]  
        Student GetStudent(string name);  
      
        [OperationContract]  
        void SaveStudent(Student student);  
    }  

با قرار دادن ServiceKnownType برای یک operationContract مشخص می کند این تنها نوع تابعی است که سرویس آن را می پذیرد.

[OperationContract]  
[ServiceKnownType(typeof(HostelStudent))]  
Student GetStudent(string name);

در داخل app.config کدهای زیر را قرار می دهیم .


    <system.runtime.serialization>  
        <dataContractSerializer>  
            <declaredTypes>  
                <add type="StudentServiceLib.Student, StudentServiceLib, Version=1.0.0.0, PublicKeyToken=null">  
                    <knownType type="StudentServiceLib.HostelStudent, StudentServiceLib, Version=1.0.0.0, PublicKeyToken=null"></knownType>  
                </add>  
            </declaredTypes>  
        </dataContractSerializer>  
    </system.runtime.serialization>  
فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • WCF
  • 3k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید