در این مقاله ، در مورد الگوی ریپوزیتوری (Repository Pattern ) که اغلب برای ایجاد برنامه های کاربردی اینتر پرایز استفاده می شود مطالبی می آموزیم. الگوی ریپوزیتوری می تواند UI برنامه، اجزای دسترسی به داده ها و Business logic را به لایه های مختلفی تقسیم می کند که به راحتی قابل نگهداری و قابل آزمایش هستند. این آموزش repository در mvc به صورت گام به گام می باشد.
برای درک بهتر الگوی ریپوزیتوری ، یک برنامه Client ایجاد خواهیم کرد. می توانیم هر نوع ساختار پروژه را برای اجرای الگوی ریپوزیتوری ایجاد کنیم. برای مثال، می توانیم یک کلاس ریپوزیتوری را در خود فولدر پروژه MVC ایجاد کنیم ، یا می توانیم پروژه ای در کلاس های مختلف ازlibrary را در به همان روش ایجاد کنیم یا می توانیم از معماری onion برای اجرای آن که شامل پروژه های کلاس های مختلفی از library و پروژه MVC در یک راه حل است را بکار گیریم.
برای سادگی کار، ما یک Repository class library و یک پروژه MVC را در یک سلوشن ایجاد خواهیم کرد. در الگوی ریپوزیتوری، می توانیم از ریپوزیتوری عمومی و کلی ( generic repository ) برای اجرای عملیات CRUD استفاده کنیم که می تواند برای اجرای عملیاتی خاص در entity ، توسط هر entity از پروژه و ریپوزیتوری مرسوم استفاده شود. ابتدا یک کلاس Client در پروژه MVC ایجاد کنید.
namespace Client.Web.Models ۰۲٫{ ۰۳٫ class Client ۰۴٫ { ۰۵٫ public int Id { get; set; } ۰۶٫ public string Name { get; set; } ۰۷٫ public string City { get; set; } ۰۸٫ public string Email { get; set; } ۰۹٫ public string Mobile { get; set; } ۱۰٫ } ۱۱٫}
الگوی Repository در MVC
سپس، ما یک رابط ( interface ) را در پروژه ریپوزیتوری class library ایجاد خواهیم نمود. این رابط شامل عملیات عمومی پایگاه داده برای هر domain entity می باشد. ما آن را IRepository نامگذاری می کنیم.
namespace Client.Repository ۰۲٫{ ۰۳٫ public interface IRepository<T> where T:class ۰۴٫ { ۰۵٫ IEnumerable<T> SelectAll(); ۰۶٫ T SelectById(int id); ۰۷٫ void Insert(T obj); ۰۸٫ void Update(T obj); ۰۹٫ void Delete(int id); ۱۰٫ void Save(); ۱۱٫ } ۱۲٫}
سپس، یک کلاس ریپوزیتوری برای اجرای این رابط ایجاد خواهیم کرد. ما آن را class Repository نامگذاری خواهیم نمود.
namespace Client.Repository ۰۲٫{ ۰۳٫ public class Repository<T>:IRepository<T> where T:class ۰۴٫ { ۰۵٫ protected readonly DbContext db; ۰۶٫ public Repository(DbContext _db) ۰۷٫ { ۰۸٫ db = _db; ۰۹٫ } ۱۰٫ public IEnumerable<T> SelectAll() ۱۱٫ { ۱۲٫ return db.Set().ToList(); ۱۳٫ } ۱۴٫ public T SelectById(int id) ۱۵٫ { ۱۶٫ return db.Set().Find(id); ۱۷٫ } ۱۸٫ public void Insert(T obj) ۱۹٫ { ۲۰٫ db.Set().Add(obj); ۲۱٫ } ۲۲٫ public void Update(T obj) ۲۳٫ { ۲۴٫ db.Entry(obj).State = EntityState.Modified; ۲۵٫ } ۲۶٫ public void Delete(int id) ۲۷٫ { ۲۸٫ T obj = db.Set().Find(Id); ۲۹٫ this.Remove(obj); ۳۰٫ } ۳۱٫ public void Save() ۳۲٫ { ۳۳٫ db.SaveChanges(); ۳۴٫ } ۳۵٫ } ۳۶٫}
برای دسترسی به داده ها ، ما از Entity framework code first approach استفاده می کنیم ، بنابراین یک کلاس DbContext ایجاد خواهیم کرد. کلاس ClientContext می تواند به صورت فهرست زیر نمایش داده شود:
namespace Client.Web.Models ۰۲٫{ ۰۳٫ using System; ۰۴٫ using System.Data.Entity; ۰۵٫ using System.Linq; ۰۶٫ ۰۷٫ public class ClientContext : DbContext ۰۸٫ { ۰۹٫ ۱۰٫ public ClientContext() ۱۱٫ : base("name=ClientContext") ۱۲٫ { ۱۳٫ } ۱۴٫ ۱۵٫ public virtual DbSet<Client> Client { get; set; } ۱۶٫ } ۱۷٫}
ارجاع به الگوی Repository در MVC
اکنون باید پروژه ریپوزیتوری class library را به پروژه MVC Web ارجاع دهیم. برای این کار، بر روی پروژه Client.Web راست کلیک کرده و پروژه reference Client.Repository را اضافه کنید. اکنون یک کنترلر را به پروژه Client.Web را (scaffold) خواهیم زد.
برای scaffold زدن، روی پوشه کنترلر راست کلیک کرده و کنترلر جدید را با استفاده از چارچوب نهاد (entity) انتخاب کرده و نام آن را Client Controller بگذارید. برای استفاده از کلاس IRepository برای عملیات پایگاه داده، موضوع و مقصود از کلاس ریپوزیتوری را ایجاد خواهیم نمود و روش کلاس ریپوزیتوری را نامگذاری خواهیم کرد. اکنون برنامه را بسازید و اجرا کنید . ما باید قادر باشیم عملیات CRUD را اجرا کنیم.
سلام در این آموزش طریقه اتصال بهپایگاه داده گفته نشده و به نظر من ناقص هست