اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
نحوه پیاده سازی و مدیریت Instance در پروژههای مبتنی بر WCF
نکته : آشنایی اولیه با مفاهیم WCF جهت درک صحیح مطالب الزامی است.
تشریح مسئله : در صورتی که نیاز باشد که نمونه ساخته شده از سرویس (سمت سرور) به صورت Singleton باشد بهترین روش برای پیاده سازی به چه صورت است.
برای شروع ابتدا مثال زیر را پیاده سازی میکنیم.
یک Contract به صورت زیر تعریف میکنیم:
حالا یک سرویس برای پیاده سازی Interface بالا مینویسیم.
همانطور که از نام سرویس مشخص است از این سرویس به ازای هر فراخوانی یک نمونه سمت سرور ساخته میشود.
حالا برای مشاهده نتیجه یک پروژه ConsoleApplication ایجاد کنید و سرویس مورد نظر را از روش AddServiceReference به پروژه اضافه کرده در فایل Program کدهای زیر را کپی کنید.
بعد از اجرا خروجی به صورت زیر است:
تنها تفاوت این سرویس با سرویس قبلی در این است که InstanceContextMode این سرویس به صورت Single معرفی شده است. یعنی به ازای n فراخوانی فقط یک نمونه از کلاس ساخته میشود. این سرویس رو هم مثل روش قبلی به Client Application اضافه کنید.
کد کلاس Program رو به صورت زیر تغییر دهید.
که بعد از اجرا خروجی به صورت زیر است.
نکته : آشنایی اولیه با مفاهیم WCF جهت درک صحیح مطالب الزامی است.
تشریح مسئله : در صورتی که نیاز باشد که نمونه ساخته شده از سرویس (سمت سرور) به صورت Singleton باشد بهترین روش برای پیاده سازی به چه صورت است.
برای شروع ابتدا مثال زیر را پیاده سازی میکنیم.
یک Contract به صورت زیر تعریف میکنیم:
[ServiceContract(SessionMode=SessionMode.Allowed)] public interface IMyService { [OperationContract] int GetData(); }
حالا یک سرویس برای پیاده سازی Interface بالا مینویسیم.
[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCall )] public class PerCallService : IMyService { int count; public int GetData() { return ++count; } }
حالا برای مشاهده نتیجه یک پروژه ConsoleApplication ایجاد کنید و سرویس مورد نظر را از روش AddServiceReference به پروژه اضافه کرده در فایل Program کدهای زیر را کپی کنید.
static void Main( string[] args ) { Console.WriteLine( "PerCall Service" ); MyPerCallService.MyServiceClient client = new MyPerCallService.MyServiceClient(); int count = 0; for ( int i = 0 ; i < 5 ; i++ ) { count = client.GetData(); } Console.WriteLine( count ); Console.ReadLine(); }
بعد از 5 بار فراخوانی متد GetData باز خروجی دارای مقدار 1 است. یعنی به ازای هر بار فراخوانی متد GetData یک نمونه از سرویس مورد نظر ساخته میشود.این عمل توسط خصوصیت InstanceContextMode که از نوع PerCall است به سرویس اعمال میشود.
حالا یک سرویس دیگر به صورت زیر ایجاد کنید.
[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )] public class SingleService : IMyService { int count; public int GetData() { return ++count; } }
کد کلاس Program رو به صورت زیر تغییر دهید.
static void Main( string[] args ) { Console.WriteLine( "Single Service" ); MySingleService.MyServiceClient client = new MySingleService.MyServiceClient(); int count = 0; for ( int i = 0 ; i < 5 ; i++ ) { count = client.GetData(); } Console.WriteLine("Result is : {0}", count ); Console.ReadLine(); }
به ازای 5 بار فراخوانی سرویس متغیر Count سمت سرور مقدار قبلی خود را حفظ کرده است.