نکته : آشنایی اولیه با مفاهیم 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 سمت سرور مقدار قبلی خود را حفظ کرده است.