قبل از اینکه به پیاده سازی UnitOfWork بپردازیم ، نیاز به ایجاد زیرساختهای لازم جهت استفاده از مدلهای موجود در برنامه داریم ، پیشنهاد میشود قبل از مطالعه این بخش ، مقاله پیاده سازی Repository Pattern بصورت Generic Class را از اینجا مطالعه کنید.
مدل فرضی ما برای این مبحث بصورت زیر می باشد.
public class Category
{
[Key]
public int Id { get; set; }
[Required]
[Display(Name="Category Name")]
public string Name { get; set; }
[Required]
[Display(Name = "Display Order")]
public string DisplayOrder { get; set; }
}
ابتدا کلاس DataContext برنامه را بصورت زیر ایجاد میکنیم.
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Category> Category { get; set; }
}
در این مرحله باید برای مدل فوق با توجه به repository ایجاد شده در مقاله قبلی ، به پیاده سازی repository روی مدل Category جهت استفاده در عملیات CRUD بپردازیم.
بنابراین یک Interface و سپس یک کلاس به نامهای ICategoryRepository و CategoryRepository ایجاد میکنیم. درون اینترفیس ICategoryRepository میتوانیم تعاریفی از توابع جدید در صورت نیاز داشته باشیم.
public interface ICategoryRepository:IRepository<Category>
{
IEnumerable<SelectListItem> GetCategoryListForDropDown();
void Update(Category category);
}
با توجه به کدهای فوق دو تابع جدید نیز به اینترفیس مورد نظر اضافه شد.
سپس باید به پیاده سازی interface فوق بپردازیم.
class CategoryRepository:Repository<Category>,ICategoryRepository
{
private readonly ApplicationDbContext _db;
public CategoryRepository(ApplicationDbContext db):base(db)
{
_db = db;
}
public IEnumerable<SelectListItem> GetCategoryListForDropDown()
{
return _db.Category.Select(i => new SelectListItem()
{
Text=i.Name,
Value = i.Id.ToString(),
});
}
public void Update(Category category)
{
var objFromDb = _db.Category.FirstOrDefault(s => s.Id == category.Id);
objFromDb.Name = category.Name;
objFromDb.DisplayOrder = category.DisplayOrder;
_db.SaveChanges();
}
}
اکنون تمامی موارد جهت ایجاد UnitOfWork انجام شدده است . در مقاله آموزشی بعدی به ایجاد UnitOfWork خواهیم پرداخت.