6

Tôi đang cố gắng để trở thành một nhà phát triển tốt hơn ...Tách Mối quan tâm Pattern Repository & Entity Framework 3.5

Những gì tôi đang làm việc với:

  1. Net MVC Framework 1.0
  2. Entity Framework 3,5

tôi đã làm một số đọc và tôi nghĩ rằng những gì tôi muốn làm là:

  1. Tạo kho lưu trữ cho từng tổng hợp trong miền. Ví dụ, một kho lưu trữ Order sẽ quản lý OrderItems của Order.
  2. Tạo một lớp dịch vụ để xử lý logic nghiệp vụ. Mỗi kho lưu trữ sẽ có một đối tượng dịch vụ tương ứng với các phương thức tương tự.
  3. Tạo DTO để qua lại giữa kho và dịch vụ
  4. Có thể tạo Chế độ xem là lớp cho Chế độ xem cần sử dụng.

Tôi có một giao diện kho lưu trữ cơ sở đó tổng hợp các giao diện kho lưu trữ của tôi sẽ thực hiện ...

public interface IRepository<T> 
    { 
     IEnumerable<T> ListAll(); 
     T GetById(int id); 
     bool Add(T entity); 
     bool Remove(T entity); 
    } 

thứ tự của tôi giao diện Repository được định nghĩa như sau ... có thể sẽ là phương pháp bổ sung khi tôi nhận được nhiều hơn vào bài tập học tập này.

public interface IOrderRepository : IRepository<Order> 
{ 
} 

Các lớp dịch vụ của tôi về cơ bản được xác định giống như kho lưu trữ ngoại trừ việc thực hiện từng dịch vụ bao gồm logic nghiệp vụ. Các dịch vụ sẽ có một giao diện kho lưu trữ trong hàm tạo (tôi chưa sẵn sàng cho IoC trong bài tập này nhưng tin rằng đó là nơi tôi muốn kết thúc xuống đường).

  1. Việc triển khai kho lưu trữ sẽ đẩy và kéo từ cơ sở dữ liệu bằng cách sử dụng Khung thực thể. Khi lấy dữ liệu; các phương pháp sẽ chỉ trả lại DTO và không phải đối tượng được tạo bởi EF
  2. Các dịch vụ (như tôi gọi chúng) sẽ kiểm soát kho lưu trữ và thực hiện logic nghiệp vụ. Các dịch vụ là những gì bạn sẽ thấy trong bộ điều khiển, tức là _orderService.GetById (1).
  3. Đây là nơi tôi bắt đầu lật nổi và có thể sử dụng một số phản hồi ... tôi có thể có các lớp dịch vụ của tôi cư trú lớp ViewModel ... tôi không có lớp ViewModel .... có lẽ đó là quá nhiều ánh xạ từ một loại khác?

Tôi rất muốn nhận được một số phản hồi về hướng tôi đang đề cập đến việc phân tách các mối quan tâm.

Cảm ơn

+0

Tôi đã cố gắng làm điều tương tự, nhưng tôi không thể nghĩ ra cách tốt để xử lý phương pháp bao gồm EF? –

+0

P.S. Bạn có chắc là bạn có nghĩa là EF 3.5? Tôi nghĩ phiên bản 1 là phiên bản hiện tại và phiên bản 2 đang trong giai đoạn thử nghiệm. Hoặc, tôi đang sử dụng phiên bản cũ của nó. –

+0

EF 3.5 = phiên bản 1, EF 4.0 = phiên bản 2 – bobwah

Trả lời

1

Tôi nghĩ bạn đang đi đúng hướng về mẫu Kho lưu trữ. Về câu hỏi của bạn về các lớp ViewModel, tôi đề nghị bạn sử dụng một cái gì đó để biến đổi kết quả đầu ra của phương thức dịch vụ kinh doanh thành một số kết quả đầu ra mong muốn. Ví dụ: dịch vụ kinh doanh đặt hàng của bạn có thể có phương thức được gọi là GetOrders(). Sử dụng thuộc tính tùy chỉnh, bạn có thể xác định loại lớp chế độ xem cho thuộc tính đó. Khung nhìn có thể lấy đầu ra của phương thức này, có thể kết hợp nó với các kiểu dữ liệu khác và trả về kết quả như một tập hợp các đối tượng với các kiểu vô danh.Trong trường hợp này, chế độ xem sẽ mất IQueryable<Order> hoặc IEnumerable<Order> làm đầu vào và trả về IList làm đầu ra.

Phương pháp này sẽ giúp bạn rất nhiều khi bạn cần hiển thị các loại chế độ xem dữ liệu khác nhau của bạn ở phía máy khách. Chúng tôi đã sử dụng một cái gì đó tương tự (nhưng phức tạp hơn) để phương pháp này trong khuôn khổ của công ty chúng tôi.

+1

Cảm ơn phản hồi. Đề xuất này nghe rất thú vị. Về cơ bản bạn có nói rằng tôi có thể tạo một thuộc tính tùy chỉnh sẽ cung cấp một cách khác để xem dữ liệu ... giống như một cái nhìn? Nếu đó là trường hợp, bạn có thể chỉ cho tôi đi đúng hướng cho khái niệm này không. Âm thanh như nó có thể là một ý tưởng tuyệt vời. Ngoài ra, khi kho lưu trữ trả về các đối tượng DTO, chúng thường giống với tên của đối tượng được tạo ra ... bạn có gợi ý chỉ sử dụng quy ước đặt tên khác cho DTO để tránh xung đột loại không? – Craig

+1

Một cách tôi làm là tạo một ViewModel cho mỗi Chế độ xem. Trường hợp các lớp ViewModel chỉ là tổng hợp của dữ liệu tôi muốn hiển thị. Tôi không thấy bất kỳ vấn đề nào khi di chuyển các thực thể ORM thông qua các ViewModels này, nhưng nếu điều đó làm cho bạn không thoải mái, bạn luôn có thể đặt các mô hình ORM trong một assembly khác, và đặt chúng ở chế độ riêng tư. Sau đó, sử dụng một cái gì đó như StuctureMap để biến chúng thành ViewModel của bạn và dữ liệu của nó. – Kris

+0

Thuộc tính tùy chỉnh sẽ cung cấp cho bạn khả năng xác định các kiểu xem có thể khác nhau cho các phương thức dịch vụ kinh doanh. Vì vậy, đầu ra của phương thức đó sẽ được đưa vào mô hình khung nhìn và nó sẽ chăm sóc tạo ra đầu ra mong muốn. Để thực hiện hành vi này, bạn sẽ cần một lớp proxy cho dịch vụ nghiệp vụ gọi phương thức mong muốn, trích xuất tên chế độ xem thích hợp từ dữ liệu meta, chuyển đầu ra kinh doanh sang dạng xem rồi trả về kết quả xem. –

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