2010-09-09 32 views
6

Tôi đang đối mặt với một số vấn đề cố gắng áp dụng DDD với EF4 (trong ngữ cảnh ASP MVC2). Advaice của bạn sẽ được đánh giá cao.Làm thế nào để bạn đối phó với DDD và EF4

Trước hết, tôi bắt đầu sử dụng POCO vì sự phụ thuộc vào ObjectContext không mấy thoải mái trong nhiều trường hợp.

Đi tới POCO đã giải quyết được một số vấn đề nhưng trải nghiệm không phải là những gì tôi đã quen với NHibernate.

Tôi muốn biết liệu có thể sử dụng nhà thiết kế và không chỉ tạo ra các thực thể mà còn là một đối tượng giá trị (kiểu phức tạp?). Nếu tôi có nghĩa là giá trị Object là một lớp học với một ctor mà không có bất kỳ tài sản thiết lập (T4 sửa đổi cần thiết?).

Cách duy nhất tôi tìm thấy để thêm hành vi vào các thực thể thiếu máu là tạo các lớp một phần mở rộng các lớp được tạo bởi edmx. Tôi không hài lòng với cách tiếp cận này.

Tôi không biết cách tạo một số kho lưu trữ với một edmx. Bây giờ tôi đang sử dụng một lớp một phần cho các phương thức nhóm cho mỗi tổng hợp. Mỗi nhóm là một kho lưu trữ trong thực tế.

Câu hỏi cuối cùng là về IQueryable. Nếu nó được tiếp xúc bên ngoài kho lưu trữ? Nếu tôi đề cập đến cuốn sách ble, kho lưu trữ phải là một đơn vị thực thi và không nên để lộ một cái gì đó như IQueryable. Bạn nghĩ sao ?

Cảm ơn sự giúp đỡ của bạn.

Thomas

+1

Về câu hỏi IQueryable, hãy xem câu hỏi này: http://stackoverflow.com/questions/1699607/asp-mvc-repository-that-reflects-iqueryable-but-not-linq-to-sql-ddd-how-to -ques/1699756 # 1699756 –

Trả lời

0

Đã một thời gian kể từ khi tôi đặt câu hỏi đó và đã có cơ hội tự làm điều đó.

Tôi không nghĩ rằng đó là cách hay để hiển thị IQueryable ở tất cả bên ngoài lớp DAL. Nó mang lại nhiều vấn đề hơn mà nó giải quyết. Tôi đang nói về các ứng dụng MVC lớn. Trước hết các phép tái cấu trúc là khó hơn, nhiều nhà phát triển sử dụng các cá thể IQueryable từ các khung nhìn và sau khi đấu tranh với thực tế là khi giải quyết IQueryable kết nối đã được xử lý. Các vấn đề về hiệu suất vì tất cả cơ sở dữ liệu thường được truy vấn cho một tập kết quả nhất định và vân vân.

Tôi thay vì phơi bày Ienumerable từ kho của mình và tin tôi, nó giúp tôi tiết kiệm rất nhiều rắc rối.

4

Đó là tốt để sử dụng POCOs, nhưng lưu ý rằng EntityObject không đòi hỏi một ObjectContext.

Có, loại phức tạp là đối tượng giá trị và có, bạn có thể tạo chúng trong trình thiết kế. Chọn một số thuộc tính của một thực thể, nhấn chuột phải và chọn refactor thành kiểu phức tạp.

Tôi thực sự khuyên bạn nên đặt phương thức kinh doanh theo loại của riêng mình chứ không phải đối tượng. Các loại "thiếu máu" có thể là vấn đề nếu bạn phải duy trì chúng, nhưng khi chúng được chứng minh là chúng hầu như không phải là vấn đề bảo trì. Tạo logic nghiệp vụ tách biệt với các loại thực thể cho phép các quy tắc kinh doanh và mô hình dữ liệu của bạn phát triển độc lập. Có, bạn phải sử dụng các lớp học một phần nếu bạn phải kết hợp những mối quan tâm này, nhưng tôi không tin rằng việc tách mô hình của bạn và các quy tắc của bạn là một điều xấu.

Tôi nghĩ rằng kho nên lộ IQueryable, nhưng bạn có thể làm cho một trường hợp tốt mà dịch vụ miền không nên. Mọi người thường cố gắng xây dựng kho lưu trữ của họ vào các dịch vụ miền, nhưng hãy nhớ rằng kho lưu trữ chỉ tồn tại để trừu tượng hóa sự tồn tại lâu dài. Các mối quan tâm như bảo mật phải nằm trong các dịch vụ miền và bạn có thể làm cho trường hợp có IQueryable có quá nhiều quyền lực cho người tiêu dùng.

+0

Cảm ơn bạn đã trả lời. Generaly Tôi đặt các phương thức hành vi rõ ràng cho các thực thể. Khi không rõ ràng tôi tạo ra một dịch vụ cho điều đó. Làm thế nào để bạn giải quyết điểm đó? Nếu kho lưu trữ tiếp xúc với IQueryable vì vậy không có đảm bảo rằng nó sẽ được xử lý bất cứ lúc nào hoặc nếu nó được xử lý sẽ có vấn đề trong khi chuyển đổi Iqueryable thành List hoặc Enumarable vì kết nối sẽ được đóng lại. –

+0

Về việc xử lý các kết nối, khuôn mặt chung của các dịch vụ miền của tôi là một đơn vị của đối tượng công việc. Đơn vị công việc thực hiện IDisposable. Đơn vị công việc giữ một tham chiếu riêng tới một cá thể ObjectContext được chuyển đến các kho lưu trữ thông qua việc xây dựng các hàm tạo. Trong trường hợp của tôi, đơn vị công việc được tiêu thụ bởi bộ điều khiển ASP.NET MVC, mà không phải là bản thân họ xử lý cho đến khi xem đã được hiển thị, vv Vì vậy, xử lý mọi thứ vào đúng thời điểm là khá tự nhiên; Tôi không bao giờ phải nghĩ về nó. –

+0

Về nơi để đưa phương thức kinh doanh, tôi thấy tự nhiên hơn khi đặt mọi thứ trong các dịch vụ miền thay vì một số dịch vụ miền và các dịch vụ khác ở những nơi khác nhau. Điều này đặc biệt quan trọng khi bạn sử dụng các dịch vụ dữ liệu như dịch vụ dữ liệu ADO.NET/Astoria. –

1

Tôi nghĩ rằng OK để hiển thị IQueryable bên ngoài kho lưu trữ, chỉ vì không làm như vậy có thể bị hạn chế không cần thiết. Nếu bạn chỉ hiển thị dữ liệu qua các phương thức như GetPeopleByBirthdayGetPeopleByLastName, điều gì sẽ xảy ra khi ai đó truy cập tìm kiếm một người theo họ là sinh nhật? Bạn có kéo tất cả những người có họ "Smith" và thực hiện tìm kiếm tuyến tính cho ngày sinh nhật bạn muốn hay bạn tạo phương thức mới GetPeopleByBirthdayAndLastName? Điều gì về người nghèo không may, những người đã thực hiện một hình thức QBE?

Quay lại khi cách duy nhất để thực hiện truy vấn đặc biệt đối với miền là tạo SQL, cách duy nhất để giữ an toàn cho bản thân là cung cấp phương pháp cụ thể để truy xuất và thay đổi dữ liệu. Bây giờ chúng ta có LINQ, mặc dù, không có lý do gì để giữ còng tay. Bất kỳ ai cũng có thể gửi một truy vấn và bạn có thể thực hiện nó một cách an toàn mà không cần quan tâm.

Tất nhiên, bạn có thể lo ngại rằng người dùng có thể xem dữ liệu của người khác nhưng dễ dàng giảm thiểu vì bạn có thể hạn chế dữ liệu nào bạn cung cấp. Ví dụ:

public IQueryable<Content> Content 
{ 
    get { return Content.Where(c => c.UserId == this.UserId); } 
} 

Điều này sẽ đảm bảo rằng chỉ Content hàng mà người dùng có thể nhận được là những người có UserId mình.

Nếu quan tâm của bạn là tải trên cơ sở dữ liệu, bạn có thể thực hiện những việc như kiểm tra biểu thức truy vấn để quét bảng (truy cập bảng mà không có điều khoản Where hoặc không có cột được lập chỉ mục trong mệnh đề Where). Cấp, đó là không tầm thường, và tôi sẽ không khuyên bạn nên nó.

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