2013-06-17 24 views
7

Tôi đang sử dụng ASP.NET MVC4 với Entity Framework 5.Thực tiễn không tốt để lọc theo ID trong mẫu kho lưu trữ

Về cơ bản mọi kết quả hành động của bộ điều khiển lọc kết quả db bằng ID công ty của người dùng đã đăng nhập. Tôi vừa bắt đầu triển khai một mẫu kho lưu trữ để trả về các mô hình thay vì lọc trực tiếp DbContext từ bộ điều khiển. (Chuyển companyID vào kho lưu trữ để lọc kết quả của phương thức)

Tôi có cảm giác buồn cười là thực hành không tốt, nhưng không thể tìm thấy bất kỳ thông tin nào về chủ đề này. Tôi sẽ chèn một phiên bản cơ bản của mã hiện tại của tôi dưới đây, tôi sẽ đánh giá cao bất kỳ thông tin về việc có hay không nó là thực hành xấu, và tại sao như vậy.

IBookingSystemRepository.cs

public interface IBookingSystemRepository : IDisposable 
{ 
    IEnumerable<Appointment> GetAppointments(); 
    IEnumerable<Appointment> GetAppointments(bool includeDeleted); 
    IEnumerable<Client> GetClients(); 
    IEnumerable<Client> GetClients(bool includeDeleted); 
    void Save(); 
} 

BookingSystemRepository.cs

public class BookingSystemRepository : IBookingSystemRepository 
{ 
    private BookingSystemEntities db; 
    int CompanyID; 

    public BookingSystemRepository(BookingSystemEntities context, int companyID) 
    { 
     this.db = context; 
     this.CompanyID = companyID; 
    } 

    public IEnumerable<Appointment> GetAppointments() 
    { return GetAppointments(false); } 

    public IEnumerable<Appointment> GetAppointments(bool includeDeleted) 
    { 
     return includeDeleted 
      ? db.Appointments.Where(a => a.User.CompanyID == CompanyID) 
      : db.Appointments.Where(a => a.User.CompanyID == CompanyID && a.Deleted.HasValue); 
    } 

    public IEnumerable<Client> GetClients() 
    { return GetClients(false); } 

    public IEnumerable<Client> GetClients(bool includeDeleted) 
    { 
     return includeDeleted 
      ? db.Clients.Where(c => c.CompanyID == CompanyID) 
      : db.Clients.Where(c => c.CompanyID == CompanyID && c.Deleted.HasValue); 
    } 

    public void Save() 
    { 
     db.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     if (db != null) 
      db.Dispose(); 
    } 
} 

TestController.cs

public class TestController : Controller 
{ 
    private BookingSystemEntities db = new BookingSystemEntities(); 

    public ActionResult AppointmentsList() 
    { 
     var user = db.Users.Single(u => u.Email == User.Identity.Name); 
     IBookingSystemRepository rep = new BookingSystemRepository(db, user.CompanyID); 
     return View(rep.GetAppointments()); 
    } 
} 

Thankyou trước để được hỗ trợ của bạn :)

Trả lời

4

Đây là ứng dụng nhiều người thuê. Việc lọc là cần thiết để giữ riêng từng dữ liệu của công ty. Cách tiếp cận của bạn là một cách âm thanh; nếu có thể, hãy cung cấp ngữ cảnh đã được lọc, thay vì lọc theo các phương thức kho lưu trữ hạ lưu riêng lẻ.

+0

Cảm ơn rất nhiều vì sự giúp đỡ của bạn và phản ứng nhanh chóng :) Tôi thậm chí không nghĩ đến việc lọc bối cảnh trước khi chuyển nó vào kho lưu trữ, tôi nghĩ cách tiếp cận của bạn sẽ làm mọi thứ đơn giản hơn cho tôi! Chỉ cần làm rõ mặc dù, bạn có nghĩa là cho tôi để tạo ra một lớp DbContext mới mà bộ lọc tất cả các DbSets dựa trên một ID thông qua để các nhà xây dựng? –

+1

Đó sẽ là một ý tưởng thú vị. Sẽ tốt hơn nếu bạn có thể kéo nó ra. Không, tôi đã suy nghĩ nhiều hơn về một kho lưu trữ hoặc lớp DBContextWrapper sẽ cung cấp kho lưu trữ thông thường của bạn. Từ quan điểm bảo mật, cách tốt nhất để nạp DBContext sẽ là cung cấp các khung nhìn trong công cụ cơ sở dữ liệu của bạn đã được lọc. Nhưng tôi không biết bạn có bao nhiêu thời gian. :) –

+0

Vì vậy, về cơ bản tạo một kho lưu trữ khác, giữa cái này và DbContext, để lọc mọi thứ đến cấp công ty? Ý tưởng của bạn về việc lọc nó bằng cách sử dụng chế độ xem cơ sở dữ liệu có lẽ là lựa chọn tốt nhất, nhưng tôi không có thời gian để làm điều đó hiện tại. Nhưng dù sao, cảm ơn rất nhiều vì sự giúp đỡ của bạn Robert. :) –

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