5

Tôi khá mới đối với mẫu kho lưu trữ và chèn phụ thuộc. Hầu như tất cả các mô hình kho tôi đã đi qua có một số loại phương pháp GetAll() như sau:Mẫu lưu trữ với các thủ tục được lưu trữ

public interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
    // other CRUD methods here... 
} 

Tôi đang gặp một vấn đề thực hiện giao diện này và phương pháp GetAll() bởi vì tôi đang kêu gọi một stored procedure mà yêu cầu thông số thay đổi dựa trên dữ liệu nhập của người dùng. Tôi không muốn thêm một phương thức đặc biệt vào giao diện kho lưu trữ, ví dụ: IQueryable<T> GetAll(string input);. Tôi cũng không muốn thêm một tham số để các nhà xây dựng vì nó trông giống một chút lộn xộn với tôi:

public class ConcreteRepository : IRepository<Entity> 
{ 
    string _storedProcedureInput; 

    public ConcreteRepository(string storedProcedureInput) 
    { 
     _storedProcedureInput = storedProcedureInput; 

    public IQueryable<Entity> GetAll() 
    { 
     // Call to stored procedure goes here passing in the 
     // _storedProcedureInput variable. 
    } 
} 

Tôi cũng đang sử dụng dependency injection vì vậy tôi sẽ có thêm một số đầu vào động để các nhà xây dựng khi ràng buộc :

Bind<IRepository<Entity>>().To<ConcreteRepository>().WithConstructorArgument(?) 

Mọi đề xuất?

UPDATE:

Tôi muốn tái sử dụng các giao diện IRepository. Ví dụ, trong một chương trình tôi đang sử dụng EF4 để thực hiện phương thức GetAll() và trong một chương trình khác, tôi đang sử dụng ADO.NET chuẩn để gọi một thủ tục lưu sẵn như ví dụ trên.

+0

Mã của bạn trông hoàn toàn ổn định và theo mô hình repostitory. –

Trả lời

5

Có vẻ như GetAll của bạn không nhất thiết phải nhận được tất cả. Trong trường hợp này, bạn cũng có thể đổi tên nó hoặc có một phương thức khác mô tả chính xác hơn các chức năng được cung cấp bởi thủ tục lưu trữ của bạn, có tham số đầu vào thích hợp có thể được chuyển đến thủ tục.

+0

Điều đó có nghĩa là tôi cần phải thêm một phương thức khác vào giao diện kho lưu trữ, ví dụ: 'IQueryable StoredProcedureMethod (đầu vào chuỗi)'? Khi nói đến thời gian để tái sử dụng giao diện kho lưu trữ, có một cơ hội tốt mà StoredProcedureMethod() sẽ không được thực hiện. – jodev

+0

@jodev Nó phụ thuộc vào những gì SP của bạn thực sự đang làm - có vẻ như nó đang trả về một tập con của tất cả các bản ghi. Bạn luôn có thể thử và trừu tượng hóa các yếu tố đầu vào bằng cách GetAllMatches (tiêu chí SomeMatchingObject). Thật khó để bình luận thêm mà không biết SP là gì. –

+0

cảm ơn. Tôi đang trở về một tập hợp con để nó có ý nghĩa rằng một phương pháp khác như bạn đề nghị nên xử lý cuộc gọi. – jodev

3

Tôi muốn đề xuất rằng nếu bạn đang sử dụng GetAll với quy trình được lưu trữ, bạn sẽ thiếu điểm.

Ví dụ về GetAll trả về quá trình thực thi trễ của IQueryable trong một số biểu mẫu, nhưng nếu bạn thực hiện cuộc gọi đến một thủ tục được lưu trữ thì việc thực thi sẽ không bị trì hoãn.

Tôi khuyên bạn nên giữ chức năng GetAll, nhưng dưới dạng cuộc gọi vào ngữ cảnh ORM của bạn. Các cuộc gọi, bạn phải làm thủ tục lưu trữ, giữ phương pháp như riêng biệt, nhưng trở lại một cái gì đó giống như IList<Entity>

+0

Cảm ơn bạn đã phản hồi. Tôi đã sửa đổi bài đăng của mình. Tôi sẽ sử dụng phương thức GetAll() cho các thủ tục lưu sẵn và 'DbContext' của EF4. – jodev

5

không thể bạn thêm một phương pháp mới trong IRepository của bạn để thực hiện proc lưu trữ tùy chỉnh:

/// <summary> 
    /// Execute Stored Proc with result set returned. 
    /// </summary> 
    /// <param name="procName"></param> 
    /// <returns>An object resultset</returns> 
    T ExecuteCustomStoredProc<T>(string procName, SqlParameter params); 

và trong bạn Thực hiện (ConcreteRepository), bạn có thể đặt logic này:

 public T ExecuteCustomStoredProc<T>(string commandName, SqlParameter params) 
     { 
      return this._repositoryContext.ObjectContext.ExecuteStoreQuery<T>(commandName, params); 
     } 
Các vấn đề liên quan