سه روش per call ، Per session و single
بسیاری از مواقع ما می خواهیم روشهای نمونه سازی (Instantiate) آبجکت های سرویس WCF روی یک سرور را کنترل کنیم.

مثلا طول زمانی را که نمونه های WCF باید روی سرور باقی بمانند را تعیین و کنترل کنیم.
فریم ورک WCF سه روش برای کنترل نمونه سازی یک آبجکت دارد. در این مقاله ما سعی داریم در ابتدا این سه روش را با نمونه کد های ساده بیان می کنیم و در ادامه شرح می دهیم که تحت شرایط گوناگون کدامیک از این روشها را باید به کار ببریم.
این مستند یک e-book کوچک برای کاربران .Net در زمینه های WCF ، WPF ، WF ، Ajax ، SQL و ... می باشد.
اصول نمونه سازی آبجکت های سرویس WCF
در یک درخواست (Request) و (Request) در ارتباطات WCF ، ترتیب وقایع زیر اتفاق می افتد:
- WCF Client یک درخواست (request) به آبجکت سرویس WCF می فرستد.
- از آبجکت سرویس یک نمونه ساخته می شود.
- نمونه ساخته شده درخواست را میزبانی کرده و پاسخ را به WCF Client می فرستد.
:در شکل زیر یک شکل تصویری از اتفاقات بالا را می بینید


در ادامه سناریوهای متفاوتی از نمونه سازی در WCF را بررسی می کنیم:
· ممکن است شما بخواهید در هر فرخوانی متد در WCF client یک نمونه جدید از سرویس WCF را بسازید.
· فقط یک نمونه از سرویس WCF باید برای هر session از کلاینت باید ساخته شود.
· فقط یک نمونه عمومی از سرویس WCF باید برای کل کلاینت ها ساخته شود.
برای انجام هر یک از سناریو های بالا سه روش برای کنترل نمونه سازی در WCF وجود دارد:
- Per call
- Per session
- Single instance


مد نمونه سازی
Per call :
وقتی ما سرویس WCF را به صورت per call تنظیم می کنیم ، سرویس در هر فراخوانی توسط پروکسی کلاینت WCF از نو نمونه سازی می شود. در تصویر زیر این مورد را می بینید:

· کلاینت WCF اولین متد را فراخوانی می کند. (Method call 1)
· نمونه (Instance) جدیدی از سرویس WCF در سرور برای این Method call ایجاد می شود.
· سرور درخواست کلاینت را انجام داده و پاسخ را می فرستد، سپس نمونه ایجاد شده توسطgarbage collector حدف می شود.
· با فراخوانی مجدد یک Method call توسط کلاینت ، مجددا یک نمونه جدید از سرویس ایجاد شده و پس از دریافت درخواست و فرستادن پاسخ ، مجددا نمونه ایجاد شده حذف می شود.
به عبارت دیگر در هر فراخوانی Method call توسط کلاینت ، یک نمونه جدید از سرویس WCF ایجاد شده و پس از ارسال پاسخ از بین می رود.
نحوه پیاده سازی مد Per call در سرویس های WCF
برای مشخص کردن مد نمونه سازی باید مقدار ‘ServiceBehavior’ را در‘InstanceContextMode’ برابر با ‘per call’ قرار دهیم. این attribute باید در کلاس ‘Service’ مشخص شود. در تکه کد زیر ‘intCounter’ به عنوان متغیر در سطح کلاس تعریف شده و شمارنده کلاس ها با هر بار فراخوانی متد ‘Increment’ ، افزوده می شود.
set کردن مقدار attribute
ServiceBehavior(InstanceContextMode = InstanceContextMode.Percall)z
public class Service : IService
{
private int intCounter;z
public int Increment()
{
intCounter++z
return intCounter;z
}
}
در کلاینت دو مرتبه متد ‘Increment’ فراخوانی می شود:
ServiceReference1.ServiceClient obj = new ServiceReference1.ServiceClient();z
MessageBox.Show(obj.Increment().ToString());z
MessageBox.Show(obj.Increment().ToString());z
در این جا می بینیم که با وجود اینکه این متد 2 بار فراخوانی شده اما باز مقدار شمارنده 1 می باشد. و سرویس WCF در هر مرتبه از نو نمونه سازی شده برای همین مقدار شمارنده همیشه 1 است.


پیاده سازی مد Per session :
برخی مواقع ما نیاز داریم که متد فراخوانی شده را برای یک session خاص نگهداریم، برای این سناریوها ما باید سرویس WCF را به صورت per session تنظیم کنیم. در این مد تنها یک نمونه از سرویس برای هر session ایجاد می شود. شکل زیر این حالت را بیان می کند:


· کلاینت یک درخواست به سرویس WCF می فرستد و متد را فراخوانی می کند.
· یک نمونه از سرویس برای پاسخ به درخواست کلاینت ایجاد می شود.
· کلاینت در همان session متد دیگری را فراخوانی می کند.
· همان نمونه قبلی ایجاد شده درخواست کلاینت را پاسخ می دهد.
· وقتی فعالیت کلاینت در آن session خاتمه می یابد، نمونه ساخته شده توسط garbage collector حذف می شود.

نحوه پیاده سازی مد
Per session در سرویس های WCF :
برای پیاده سازی این مد باید مقدار ویژگی‘ServiceBehavior’ را برابر با مقدار ‘PerSession’ در آبجکت ‘InstanceContextMode’ قرار دهیم.
ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)z
public class Service : IService
{
private int intCounter;z
public int Increment()
{
intCounter++z
return intCounter;z
}
}
سمت کلاینت زمانی که کد زیر اجرا می شود ، پس از اجرا مقدار شمارنده برابر با 2 می شود.
ServiceReference1.ServiceClient obj = new ServiceReference1.ServiceClient();z
MessageBox.Show(obj.Increment().ToString();z
MessageBox.Show(obj.Increment().ToString();z






مد نمونه سازی Single :
گاهی اوقات ما می خواهیم یک نمونه عمومی از سرویس برای تمام کلاینت ها بسازیم. برای انجام این کار باید سرویس WCF به صورت single مد تنظیم شود. در شکل زیر این مطلب توضیح داده می شود:




· کلاینت 1 یک متد را روی سرویس WCF فراخوانی می کند.
· یک نمونه از سرویس ساخته می شود و پاسخ دادن به درخواست کلاینت اول، برای سرویس دادن به سایر کلاینت ها در حافظه مقیم می شود.
· حالا کلاینت 2 یک متد را فراخوانی می کند.
· نمونه ایجاد شده قبلی که هنوز در حافظه موجود است ، به درخواست کلاینت 2 پاسخ می دهد. به عبارت دیگر این نمونه ساخته شده عمومی به درخواست تمام کلاینت ها پاسخ می دهد.
پیاده سازی Single Instance mode :
ابتدا مقدار ‘InstanceContextMode’ را برابر با single قرار می دهیم.


[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service : IService
{
}


این بار اگر شما از کلاینت های مختلف روی سرویس WCF درخواست بفرستید ، هر بار مقدار شمارنده زیاد می شود و متغیر شمارنده یک متغیر عمومی می باشد.




چه موقعی باید از هر یک از مد های سرویس WCF (per call, per session and single ) استفاده کرد؟
· Per call
- زمانی که شما یک سرویس Stateless (بدون حالت) دارید.
- زمانی که سرویس، منابع حجیم مثل connection object ها و memory object های بزرگ را نگه می دارد.
- مقیاس پذیری یک نیاز اولیه است . ممکن است معماری سرویس شما در طول زمان رو به رشد باشد (scale out Architecture)
- فانکشن های WCF به صورت یک single thread فراخوانی شوند.
· Per Session
- زمانی که می خواهیم state های مابین فراخوانی سرویس WCF را نگهداریم.
- ممکن است بخواهید یک معماری scale up (توسعه یافته ، افزایشی) داشته باشید. یعنی بتوانید از منابع مشترک برای سرویس ها استفاده کنید.
- داشتن منابع سبک و کم حجم
· Single
- زمانی که بخواهیم یک منبع داده عمومی را در کل سرویس به اشتراک بگذاریم.
- مقیاس پذیری نداشته باشیم.




منبع : سایت چکاد