2013-05-17 31 views
5

Tình huống: Tôi đang viết một chương trình xử lý việc tạo báo cáo.Tôi có nên sử dụng các mô hình riêng biệt cho tên miền và EF không?

Tôi có báo cáo được lưu trữ trong cơ sở dữ liệu, được ánh xạ tới một mô hình EF. Có một số trường không phải là cơ sở dữ liệu (nghĩa là một số trường được tính tự động dựa trên các trường khác CÓ trong db). Sẽ có ý nghĩa khi có một lớp chỉ bản đồ cho DB, và một lớp khác có thông tin đó và bổ sung có các trường tính toán khác không?

tức là một lớp học mẫu để tương tác với cơ sở dữ liệu codefirst sẽ

public class Report{ 
    public int CategoryOneSeverity {get; set;} 
    public int CategoryTwoSeverity {get;set;} 
    public string Title {get;set;} 
} 

Nó sẽ làm cho tinh thần để làm lớp học khác, như:

public class ReportModel{ 
    public int CategoryOneSeverity; 
    public int CategoryTwoSeverity; 
    public string Title; 

    public int RiskRating{ 
     get{ return CategoryOneSeverity + CategoryTwoSeverity; } 
    } 
}  

Hoặc tài sản RiskRating phải ở trong EF mô hình.

+0

Tôi đồng ý với câu trả lời được chấp nhận rằng bạn nên có các lớp riêng biệt - một để lập mô hình kho dữ liệu và một để mô hình miền doanh nghiệp của bạn. Tuy nhiên, lớp thứ hai của bạn vi phạm một số tiên đề thiết kế tốt, rõ ràng nhất trong số đó là các lĩnh vực không nên được công khai tiếp xúc. –

+0

Tôi thực sự không thích đặt trong các thành viên tư nhân và sau đó sử dụng một tài sản để có được nó. không phải là một lĩnh vực có ý nghĩa hơn, đặc biệt là cho các khu vực được dự kiến ​​sẽ thay đổi? tức là người dùng có thể thay đổi tiêu đề bất kỳ lúc nào. – appsecguy

+1

Không, thực sự, nó không có ý nghĩa và, như tôi đã nói, bay khi đối mặt với thiết kế tốt.Thuộc tính cho phép bạn thêm logic xác thực, thay đổi biểu diễn trường sao lưu bằng một chuyển đổi và cuối cùng cho phép bạn giữ một diện tích bề mặt người tiêu dùng ổn định. Hãy để người bạn tốt của chúng tôi Jon Skeet nói điều đó tốt hơn: http://www.csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx –

Trả lời

4

Có, tôi hoàn toàn tin rằng bạn nên có các lớp khác nhau để tạo mô hình miền của bạn hơn DB của bạn. Trừ khi ứng dụng của bạn cực kỳ tầm thường, nếu bạn cố gắng ánh xạ trực tiếp đối tượng miền của mình, bạn luôn phải thay đổi chúng để khớp với những gì bạn cần cấu trúc dữ liệu của mình và có thể phơi bày những thứ bạn không muốn hiển thị. Hãy coi nó như là một sự vi phạm nguyên tắc Trách nhiệm duy nhất; lớp của bạn có hai lý do để thay đổi nếu bạn đặt nó làm đối tượng miền của bạn và ánh xạ nó trực tiếp. Một là để đáp ứng với thay đổi yêu cầu kinh doanh, khác là để đáp ứng với thay đổi lược đồ lưu trữ dữ liệu.

+0

"lớp học của bạn có hai lý do để thay đổi nếu bạn đặt đối tượng miền của mình và ánh xạ trực tiếp. Một là để đáp ứng yêu cầu kinh doanh thay đổi, lớp kia là để phản hồi thay đổi lược đồ lưu trữ dữ liệu". - Điều đó đã giúp tôi hình dung nó một cách hoàn hảo. Cảm ơn! – appsecguy

4

"Nó sẽ làm cho tinh thần để có một lớp học mà chỉ bản đồ đến DB, và khác lớp mà sẽ đưa thông tin đó và bổ sung có lĩnh vực tính toán khác?"

Rất có thể. Thông thường tôi sẽ tạo một lớp mới được gắn với "ViewModel" như HumanResourcesReportViewModel nếu lớp thực thể của tôi là HumanResourcesReport.

Có rất nhiều biến thể về cách sử dụng ViewModels và chúng tôi có thể tham gia vào cuộc tranh luận về thuật ngữ, nhưng khái niệm, lấy thực thể của bạn và tạo một lớp mới với dữ liệu đó cùng với bất kỳ thông tin bổ sung nào bạn cần để xử lý báo cáo. Trong trường hợp này, việc tạo báo cáo là một cách mà khung nhìn của mô hình MVC, vì vậy tôi không nghĩ rằng nó gây khó chịu khi gọi lớp đang giữ dữ liệu là một ViewModel.

+0

Tôi nghĩ bạn đang nói về đầu kia của kiến ​​trúc; tức là giao diện người dùng. ViewModels được sử dụng trong giao diện người dùng; đó là lý do tại sao chúng được gọi là mô hình 'View'. –

+1

@Robert Tạo báo cáo ở cuối Chế độ xem. Bạn lấy dữ liệu từ cơ sở dữ liệu, định dạng nó thành một ViewModel, sau đó tạo một báo cáo là bản trình bày dữ liệu của bạn. Cho dù nó được tạo ra thông qua một công cụ báo cáo hoặc một công cụ html, nó là một cái nhìn. Bạn có thể gọi nó là bất cứ điều gì bạn cảm thấy thoải mái, nhưng về khái niệm thì nó cũng giống nhau. Bạn cần thêm một số dữ liệu không phải là một phần của thực thể. – AaronLS

+0

Ah, tôi hiểu ý của bạn là gì. Tính toán RiskRating là một hàm * display *. –

4

Bạn có đang sử dụng Mã đầu tiên của DB trước không?

Bạn có thể có các trường được tính toán tự động trong mô hình của mình, không được ánh xạ tới các trường trong cơ sở dữ liệu.

Nó cũng phụ thuộc vào kiến ​​trúc của bạn. Nếu bạn đang sử dụng DB đầu tiên, làm mới mô hình EF của bạn sẽ cập nhật các lớp EF của bạn, mất các trường được ánh xạ của bạn. Trong kịch bản DB-First, một giải pháp thay thế sẽ là sử dụng lớp mô hình EF làm lớp cơ sở của bạn và kế thừa từ lớp đó cho lớp báo cáo của bạn.

public class ReportModel 
{ 
public int CategoryOneSeverity; 
public int CategoryTwoSeverity; 
public string Title; 
} 

public class ReportClass : ReportModel 
{ 
public int RiskRating 
{ 
get{ return CategoryOneSeverity + CategoryTwoSeverity; } 
} 
} 
+0

Điều này hoạt động khá kém trong tất cả các ứng dụng tầm thường nhất. – Andy

+0

+1 Bạn cũng có thể thêm các thuộc tính trực tiếp vào lớp ReportModel của bạn và gắn thẻ chúng với thuộc tính '[NotMapped]'. Tiết kiệm cho bạn một lớp học bổ sung, nhưng mặt khác nó clutters lớp thực thể của bạn với các thuộc tính bạn có thể không sử dụng thường xuyên. Vì vậy, nó là một chút của một cuộc gọi phán quyết trên con đường mà bạn đi. – AaronLS

+0

Andy: Không có nhiều thông tin để tiếp tục và được dự định thể hiện những gì có thể đạt được, với thông tin được cung cấp, chứ không phải là giải pháp hoàn toàn làm việc. –

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