ممنون. الگوهای طراحی برنامه نویسی شیءگرا یک حالت عمومی دارند. یعنی مختص به یک فناوری یا زبان خاص یا حتی یک محصول خاص نیستند. بگردید برای LINQ to SQL هم پیاده سازی الگوی Repository وجود دارد.
کلا استفادهی از هر کدام از ORMs موجود بدون پیاده سازی الگوی Repository اشتباه است. به چند دلیل:
- مخفی کردن ساز و کار درونی یک ORM : برای مثال من جدا قصد ندارم این رو حفظ کنم که فلان ORM خاص چطور Insert انجام میدهد. من فقط میخواهم یک متد Insert داشته باشم. یکبار این رو در الگوی Repository پیاده سازی میکنم و بعد فراموش میکنم که این ORM الان EF است یا NH یا هرچی
- امکان تعویض کلی یک ORM : زمانیکه من در کدهای BLL خودم فقط از متد Insert پیاده سازی شده مطابق رهنمونهای الگوی Repository استفاده کردم، دیگر BLL درکی از ORM نخواهد داشت. برای کوچ کردن به یک ORM دیگر فقط کافی است تا Repository را عوض کرد. مابقی برنامه دست نخورده باقی میماند.
- نوشتن Unit test با استفاده از الگوی Repository سادهتر است: این الگو چون بر مبنای یک Interface پیاده سازی میشود، امکان Mocking این Interface در Unit tests سادهتر است.
کلا استفادهی از هر کدام از ORMs موجود بدون پیاده سازی الگوی Repository اشتباه است. به چند دلیل:
- مخفی کردن ساز و کار درونی یک ORM : برای مثال من جدا قصد ندارم این رو حفظ کنم که فلان ORM خاص چطور Insert انجام میدهد. من فقط میخواهم یک متد Insert داشته باشم. یکبار این رو در الگوی Repository پیاده سازی میکنم و بعد فراموش میکنم که این ORM الان EF است یا NH یا هرچی
- امکان تعویض کلی یک ORM : زمانیکه من در کدهای BLL خودم فقط از متد Insert پیاده سازی شده مطابق رهنمونهای الگوی Repository استفاده کردم، دیگر BLL درکی از ORM نخواهد داشت. برای کوچ کردن به یک ORM دیگر فقط کافی است تا Repository را عوض کرد. مابقی برنامه دست نخورده باقی میماند.
- نوشتن Unit test با استفاده از الگوی Repository سادهتر است: این الگو چون بر مبنای یک Interface پیاده سازی میشود، امکان Mocking این Interface در Unit tests سادهتر است.