2012-03-18 31 views
6

Tôi đang bận đọc và thưởng thức, Dependency Injection in .Net của Mark Seemann.Logic miền và xác thực dữ liệu

Rất khó để tôi giải thích ngữ cảnh chính xác, vì vậy hãy chỉ bận tâm với câu hỏi này nếu bạn đã quen thuộc với cuốn sách.

Câu hỏi của tôi phải thực hiện với hai lớp Sản phẩm trong chương 2 pg 49. Có một lớp trong lớp Miền và một trong lớp truy cập dữ liệu. Nó được giải thích rằng lớp sản phẩm trong lớp truy cập dữ liệu được tạo ra bởi trình hướng dẫn LINQ to Entity.

Tôi đang làm việc với LINQ to SQL và tôi có thể tô điểm cho lớp mô hình của mình với các thuộc tính Ling to SQL, để tôi không phải có lớp thứ hai. Ví dụ.

[Table(Name="Customers")] 
public class Customer 
{ 
    [Column(IsPrimaryKey=true)] 
    public string CustomerID; 
    [Column] 
    public string City; 
} 

Tuy nhiên tôi cảm thấy điều này được trộn mối quan tâm và nó sẽ có hiệu lực chặt vài lớp miền của tôi vào lớp LINQ to SQL truy cập dữ liệu. Bạn có đồng ý với điều này?

Giả sử tôi tạo hai lớp 'Khách hàng', cho lớp miền và lớp truy cập dữ liệu. Giả sử Thành phố là trường bắt buộc. Khi lưu, quy tắc này cần được kiểm tra. Điều này có nên được thực hiện trong lớp miền hoặc lớp truy cập dữ liệu hay cả hai?

Cảm ơn, Daryn

Trả lời

5

Tuyệt đối, cặp lớp miền của bạn vào DAL. Thậm chí tệ hơn, các thực thể lớp miền của bạn sẽ có cấu trúc giống như các bảng trong DB của bạn. Nếu những bảng đó có quan hệ, thì đó sẽ không phải là biểu diễn tốt nhất của một mô hình miền.

Những gì chúng ta làm là để các thực thể LINQ-SQL tồn tại trong DAL, và sau đó chúng ta có các lớp ánh xạ trong DAL chuyển đổi thực thể L2S thành thực thể miền và ngược lại. Và đó là okay, bởi vì DAL thực sự là ORM của bạn, và một phần của công việc của nó là làm bản đồ này.

Tôi có thể nói rằng nếu Thành phố được yêu cầu, dưới dạng quy tắc kinh doanh, thì đó là logic nghiệp vụ và thuộc về quy tắc kinh doanh trong lớp logic nghiệp vụ. Có các gói xác thực có thể giúp bạn giải quyết vấn đề này.

+0

Cả hai câu trả lời rất giống nhau, cả hai đều giúp. Đây là lần đầu tiên ... – Daryn

+1

@Daryn: Bạn nên upvote cả hai câu trả lời nếu cả hai đã giúp. – jgauffin

+0

Không vấn đề gì, tôi sẽ bình chọn cho bạn – Daryn

6

Tuy nhiên tôi cảm thấy điều này đang trộn lẫn mối quan tâm và nó sẽ có hiệu lực chặt chẽ vài lớp miền của tôi vào lớp truy cập dữ liệu LINQ to SQL. Bạn có đồng ý với điều này?

Vâng, đúng vậy. Cả Entity Framework (mã đầu tiên) và nhibernate đều có thể sử dụng các lớp bản đồ riêng biệt mà sẽ làm cho các mô hình của bạn sạch sẽ mà không phụ thuộc vào OR/M.

Lưu ý phụ: Mô hình miền không được đặt công khai cho thuộc tính (trong DDD). Vì nó di chuyển hiệu quả mô hình logic ra bên ngoài mô hình.

Giả sử tôi tạo hai lớp 'Khách hàng', cho lớp miền và lớp truy cập dữ liệu. Giả sử Thành phố là trường bắt buộc. Khi lưu, quy tắc này cần được kiểm tra. Điều này có nên được thực hiện trong lớp miền hoặc lớp truy cập dữ liệu hay cả hai?

Thực thể cơ sở dữ liệu chỉ nên tồn tại trong các lớp lưu trữ và do đó không nhất thiết phải xác thực. Mô hình miền đang được lưu nên đã có trạng thái chính xác.

Ví dụ:

public class ArticleRepository 
{ 
    public void Save(Article article) 
    { 
     // Article is already in a correct state 
     // (thanks to no public setters) 

     var dbEntity = new ArticleEntity(); 
     Mapper.Map(article, dbEntity); 
     _dbContext.Save(dbEntity); 
    } 
} 
+0

trả lời rất tốt và rất chính xác. – kamal

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