قرار دادن تنظیمات WCF Client در یک Class Library
پنجشنبه 26 آذر 1394در این مقاله قصد داریم سرویس WCF را که به صورت یک Class library ایجاد شده است را درون یک پروژه از نوع کنسول استفاده کنیم .
همان طور که می دانید پروژه هایی از نوع Class Library به تنهایی اجرا نمی شوند. خروجی این نوع پروژه ها از نوع dll است که شما می توانید با افزودن این dll ها به پروژه خود از کلاس ها و توابعی که درون آنها وجود دارد استفاده کنید .
در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .
Class Library متشکل از چندین کلاس است که در داخل هر کدام از این کلاس ها متد هایی وجود دارند که کار خاصی را انجام می دهند .برای استفاده از از این dll ها کافی است که آنها را به پروژه خود اضافه کنید .برای اضافه کردن dll خاص بر روی Refrences کلیک راست کنید و add refrences را بزنید .سپس مسیر dll مورد نظر را انتخاب کنید .
در مقاله پیش رو قصد داریم تمام تنظیمات مربوط به WCF در سمت کلاینت را در داخل یک Class Library قرار دهیم .ابتدا یک پروژه از نوع WCF service Library ایجاد می کنیم .به شکل زیر توجه کنید
در این پروژه به صورت پیش فرض دو کلاس به نام های IService1.cs و Service1.cs ایجاد می شوند که هر دو آنها را پاک می کنیم .
ما قصد داریم که یک سرویس کتاب ایجاد کنیم .بنابراین یک فولدر به نام server ایجاد کنید .یک اینترفیس جدید به نام IBookService به پروژه اضافه کنید .به این اینترفیس صفت [ServiceContract] را اضافه کنید .با این کار اعلام می کنید که سرویس اصلی شما این سرویس می باشد.
یک متد به نام GetAllBooks ایجاد کنید .به این متد صفت [OperationContract]. بدهید.این صفت اعلام می کند که این متد در واقع تابعی است که در درون سرویس به ارائه کاری می پردازد.
بعد از این یک کلاس جدید به نام Book ایجاد می کنیم .این کلاس به عنوان دیتای ما ایفای نقش خواهد کرد.
اینترفیس ما مانند زیر خواهد بود
using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; namespace MyService { [ServiceContract] public interface IBookService { [OperationContract] IList<Book> GetAllBooks(); } /// <summary> /// Book DTO /// </summary> [DataContract] public class Book { [DataMember] public int BookId { get; set; } [DataMember] public string BookName { get; set; } } }
یک کلاس جدید به نام BookService ایجاد می کنیم این کلاس از اینترفیس IBookService ارث بری می کند .و باید تمام متد های آن را ارث بری کند. پیاده سازی این کلاس ب صورت زیر خواهد بود
using System.Collections.Generic; namespace MyService { public class BookService : IBookService { public IList<Book> GetAllBooks() { return new List<Book> { new Book { BookId = 1, BookName = "Gold of Small Things"}, new Book { BookId = 2, BookName = "The Guide"}, new Book { BookId = 3, BookName = "Midnight's Children"}, new Book { BookId = 4, BookName = "Wings of Fire"}, new Book { BookId = 5, BookName = "My Experiements with Truth"}, }; } } }
در مرحله بعد هر چیزی که در داخل app.config وجود دارد را پاک کنید .و محتوای زیر را در ان کپی کنید .در کد زیر ما نام سرویس ، آدرس پایه ، و همین طور Endpoint را برای اینکه به BookService اشاره کند تغییر داده ایم .
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <compilation debug="true" /> </system.web> <!-- When deploying the service library project, the content of the config file must be added to the host's app.config file. System.Configuration does not support config files for libraries. --> <system.serviceModel> <services> <service name="MyService.BookService"> <host> <baseAddresses> <add baseAddress = "http://localhost:8733/Design_Time_Addresses/MyService/BookService/" /> </baseAddresses> </host> <!-- Service Endpoints --> <!-- Unless fully qualified, address is relative to base address supplied above --> <endpoint address="" binding="basicHttpBinding" contract="MyService.IBookService"> <!-- Upon deployment, the following identity element should be removed or replaced to reflect the identity under which the deployed service runs. If removed, WCF will infer an appropriate identity automatically. --> <identity> <dns value="localhost"/> </identity> </endpoint> <!-- Metadata Endpoints --> <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- To avoid disclosing metadata information, set the value below to false before deployment --> <serviceMetadata httpGetEnabled="True"/> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
کاری که تا کنون انجام داده ایم ایجاد یک wcf بوده است که درسمت سرور اجرا می شود .در داخل پروژه wcf خود یک سرویس کوچک به نام BookService ایجاد کرده ایم .حال قصد داریم که در داخل یک Class Library این سرویس را فراخوانی کنیم.یک پروژه از نوع Class Library به نام BusinessLogicLayer ایجاد می کنیم .این کلاس به عنوان لایه منطق ما ایفای نقش خواهد کرد.در این قسمت است که ما سرویس wcf خود را اضافه خواهیم کرد.
بعد از ساخت Class Library کلاسی که به صورت پیش فرض ساخته شده است را پاک کنید .می توانید با ویزادی که ویژوال در اختیارتان قرار می دهد سرویسی که ساخته اید را به پروژه ای اضافه کنید .روش دیگری هم وجود دارد که ساخت یک کلاس proxy به صورت دستی است .
روش اول در شکل زیر نشان داده شده است
سپس در این پنجره دکمه discover را بزنید ، سرویس هایی که یافت می شوند لیست خواهد شد و می توانید به انتخاب یک بپردازید.
حال قصد داریم که یک متد جدید در داخل کلاس BookManager ایجاد کنیم .به کد زیر توجه کنید .
using System.Collections.Generic; using System.Linq; namespace BusinessLogicLayer { public class BookManager { public List<Book> GetMyBooks() { var client = new MyService.BookServiceClient(); var apiResult = client.GetAllBooks(); return apiResult.Select(x => new Book { BookId = x.BookId, BookName = x.BookName }).ToList(); } } } //Book class public class Book { public int BookId { get; set; } public string BookName { get; set; } }
حال باید application سمت کاربر را بسازیم .یک فولدر جدید به نام Client ایجاد می کنیم .در داخل این فولدر یک پروژه از نوع کنسول ایجاد می کنیم .سپس Class Library را که ایجاد کرده بودیم به این پروژه refrence میدهیم .
شکل زیر solution Explorer را نشان میدهد
در داخل کلاس BusinessLogicLayer یک کلاس به نام ServiceManager ایجاد می کنیم .کد زیر را ببینید
using System.Configuration; using System.Reflection; using System.ServiceModel.Configuration; namespace BusinessLogicLayer { public class ServiceManager { public static T CreateServiceClient<T>(string configName) { string _assemblyLocation = Assembly.GetExecutingAssembly().Location; var PluginConfig = ConfigurationManager.OpenExeConfiguration(_assemblyLocation); ConfigurationChannelFactory<T> channelFactory = new ConfigurationChannelFactory<T>(configName, PluginConfig, null); var client = channelFactory.CreateChannel(); return client; } } }
در داخل برنامه کنسول کد های زیر را می نویسیم
static void Main(string[] args) { var bookManager = new BusinessLogicLayer.BookManager(); var myBooks = bookManager.GetMyBooks(); foreach (var myBook in myBooks) { Console.WriteLine(myBook.BookName); } Console.ReadKey(); }
بعد از اجرا شکل زیر را خواهیم دید
- WCF
- 2k بازدید
- 5 تشکر