5

Tôi đang cố triển khai mẫu lưu trữ chung. Tôi tìm thấy trang web này mà tôi nghĩ rằng nó cũng giải thích. http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangleMẫu Kho lưu trữ Chung với Mẫu UnitOfWork

Mục đích của tôi là lưu các nhà phát triển một thời gian và tổ hợp phím và tôi biết điều này sẽ giúp tôi.

Vì vậy, tôi có 2 câu hỏi:
1. Đây có phải là cách tiếp cận tốt hay không, tôi có gặp phải một số vấn đề trong tương lai không?
2. Làm thế nào tôi có thể kết hợp nó với mô hình Unitofwork ?, Tôi không thể tạo một thể hiện của lớp trừu tượng tất nhiên, vì vậy mã sau không hợp lệ.

public class UnitOfWork : IDisposable 
    { 
     #region Private fields 
     private readonly MyCompanyContext _context = new MyCompanyContext(); 
     private GenericRepository<MyCompanyContext, Task> _taskRepository; 

     public GenericRepository<MyCompanyContext, Task> TaskRepository 
     { 
      get 
      { 
       return _taskRepository ?? 
         (_taskRepository = new GenericRepository<MyCompanyContext, Task>()); 
      } 
     } 




namespace MyCompany.DAL.Repository 
{ 
    public interface IGenericRepository<T> where T : class 
    { 
     IQueryable<T> GetAll(); 
     IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); 
     void Add(T entity); 
     void Delete(T entity); 
     void Edit(T entity); 
     void Save(); 
    } 

    public abstract class GenericRepository<C, T> : 
    IGenericRepository<T> 
     where T : class 
     where C : DbContext, new() 
    { 

     private C _entities = new C(); 
     public C Context 
     { 

      get { return _entities; } 
      set { _entities = value; } 
     } 

     public virtual IQueryable<T> GetAll() 
     { 

      IQueryable<T> query = _entities.Set<T>(); 
      return query; 
     } 

     public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
     { 
      IQueryable<T> query = _entities.Set<T>().Where(predicate); 
      return query; 
     } 

     public virtual void Add(T entity) 
     { 
      _entities.Set<T>().Add(entity); 
     } 

     public virtual void Delete(T entity) 
     { 
      _entities.Set<T>().Remove(entity); 
     } 

     public virtual void Edit(T entity) 
     { 
      _entities.Entry(entity).State = System.Data.EntityState.Modified; 
     } 

     public virtual void Save() 
     { 
      _entities.SaveChanges(); 
     } 
    } 
} 

Trả lời

5

Có một số ý kiến ​​liên quan đến kho, nhưng sau khi cố gắng triển khai kho khác nhau trong sản xuất cho vài năm bản thân mình, tôi đồng ý với ý kiến ​​Ayende's, kho đó, đặc biệt là chung chung, là không cần thiết lớp trừu tượng.

tôi thích rất nhiều khóa học này: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents/linq-architecture

Nó đi qua hầu hết các giải pháp khả thi và giải thích hàng hóa và bads.

Những gì chúng tôi đang sử dụng ngay bây giờ là trừu tượng rất mỏng trên datacontext, chỉ để vượt qua các vấn đề kiểm tra LINQ2Sql, mà không liên quan trong hầu hết các trường hợp khi sử dụng EF.

2

Với rất nhiều nỗ lực bạn có thể nhận được rằng làm việc, nhưng tôi tự hỏi, nếu nỗ lực thực sự là giá trị nó? Tôi đã từng thấy các triển khai như thế này trước đây, và họ thực sự đấu tranh khi cố gắng quản lý các mối quan hệ nhiều-nhiều (có suy nghĩ về cách bạn quản lý điều đó trong kịch bản của bạn). Bạn đang sử dụng Khung thực thể, quyền ORM? Các ORM như Entity Framework và nHibernate được thiết kế để trừu tượng hóa việc triển khai cơ sở dữ liệu từ mã ứng dụng, vậy mục đích của việc thêm một trừu tượng khác ở trên nó là gì để quản lý các thực thể ở mức chi tiết như vậy? Nếu đó là một câu hỏi kiểm tra, thì bạn có thể sử dụng một khuôn khổ mocking để giả lập bối cảnh, do đó loại bỏ sự cần thiết cho một cơ sở dữ liệu thực tế trong quá trình thử nghiệm. Tuy nhiên, nếu vì lý do kiến ​​trúc hoặc bảo mật bạn đang tìm cách xóa tương tác với ngữ cảnh db khỏi mã ứng dụng của mình, tôi khuyên bạn nên sử dụng thực thi mẫu lệnh trên đầu khung thực thể. Tôi cần làm điều này trên một ứng dụng doanh nghiệp quy mô lớn hơn (ngân hàng) vì lý do bảo mật (đúng hay sai), chúng tôi hoàn toàn không được phép có kết nối db trong mã ứng dụng của chúng tôi.

+0

Tôi không nghĩ rằng tôi đang thêm một lớp trừu tượng khác, tôi chỉ đơn giản là viết mã của tôi để làm cho nó dễ sử dụng hơn. với mô hình kho lưu trữ chung tôi có thể làm CRUD theo cách rất hiệu quả. Nhưng đó là lý do tại sao tôi hỏi câu hỏi đầu tiên của tôi ở nơi đầu tiên, Tôi có vấn đề kỹ thuật với phương pháp này –

+0

Có, bạn nói đúng, với UOW bạn không thực sự thêm một lớp trừu tượng khác. Tôi nghĩ rằng mặc dù ngoại trừ trong các tình huống rất đơn giản UOW không phải là rất hữu ích, và có, tôi nghĩ rằng bạn có thể có vấn đề kỹ thuật nếu bạn phải quản lý bất kỳ mối quan hệ nhiều-nhiều. –

+0

@LuisEValencia> hm, tôi không thấy cách đơn giản hóa mã của bạn? – Giedrius

Các vấn đề liên quan