Trong tuần qua, tôi đã đọc rất nhiều bài báo và hướng dẫn về mẫu kho lưu trữ. Nhiều bài viết liên kết chặt chẽ mô hình kho lưu trữ với đơn vị mẫu công việc. Trong những bài viết này, tôi thường tìm mã tương tự như sau:Kho lưu trữ và Đơn vị công việc - chịu trách nhiệm về điều gì?
interface IUnitOfWork<TEntity>
{
void RegisterNew(TEntity entity);
void RegisterDirty(TEntity entity);
void RegisterDeleted(TEntity entity);
void Commit();
void Rollback();
}
interface IRepository<TKey, TEntity>
{
TEntity FindById(TKey id);
IEnumerable<TEntity> FindAll();
void Add(TEntity entity);
void Update(TEntity entity);
void Delete(TEntity entity);
}
class Repository : IRepository<int, string>
{
public Repository(IUnitOfWork<string> context)
{
this.context = context;
}
private IUnitOfWork<string> context;
public void Add(string entity)
{
context.RegisterNew(entity);
}
public void Update(string entity)
{
context.RegisterDirty(entity);
}
public void Delete(string entity)
{
context.RegisterDeleted(entity);
}
/* Entity retrieval methods */
}
Am Tôi hiểu một cách chính xác rằng các đơn vị của đối tượng làm việc là có nghĩa là để xử lý việc bổ sung, cập nhật hoặc xóa bất kỳ đối tượng trong các cửa hàng dữ liệu cơ bản (trong trường hợp của tôi, một dịch vụ thư mục mà tôi giao tiếp với thông qua LDAP)? Nếu đó là sự thật, nó có nên xử lý sự truy hồi của bất kỳ đối tượng nào không? Tại sao không phải là một phần của giao diện UoW được đề xuất?
Vì vậy, khi một phương thức 'Repository.Add (obj)' được gọi, thay đổi được đăng ký với đơn vị của đối tượng công việc. Sau đó, khi 'unitOfWork.Commit()' được gọi, Kho lưu trữ truy xuất các hoạt động đang chờ xử lý từ đơn vị công việc và thực hiện chúng? –
@Justin R. - có vẻ đúng, mặc dù chi tiết có thể phụ thuộc vào việc triển khai. – Oded
Nếu logic để thực hiện thay đổi nằm trong đối tượng kho lưu trữ và đơn vị công việc chỉ theo dõi các thay đổi đang chờ xử lý, thì đơn vị công việc khác với một tập hợp các thay đổi đang chờ xử lý đơn giản như thế nào? Và tại sao nó lại có các phương thức Commit/Rollback của riêng nó (như gợi ý trong giao diện UoW của Martin Fowler)? –