2009-08-24 62 views
6

tôi đã làm việc thành công với linq2sql và linq DTOs (các lớp được tạo bởi linq2sql) ....Lẫn lộn giữa các đối tượng DTO (linq2sql) và Lớp!

Tôi bối rối, tôi có nhiệm vụ cập nhật ứng dụng cũ và tôi có thể thấy rằng DTO của tôi sẽ được sử dụng như thế nào họ nên .... để vận chuyển ngày

Tôi đang sử dụng mẫu lưu trữ để tôi chuyển dữ liệu từ kho lưu trữ đến dịch vụ qua dqos linq2sql ... khi tôi ở trong lớp dịch vụ (đây là cơ bản logic kinh doanh của tôi) sau đó tôi cần phải vượt qua xung quanh các đối tượng lớp ..

các đối tượng lớp này là cơ bản một hình ảnh phản chiếu (nhiều hơn hoặc ít hơn) của các dtos - có như vậy tôi thay đổi ở một số địa điểm nhưng thường giống nhau ..

Vì vậy, hãy quay lại câu hỏi trong tay! - là thực hành tốt để sử dụng dtos chỉ để truyền dữ liệu từ kho lưu trữ đến lớp dịch vụ ... và một lần trong lớp dịch vụ (logic nghiệp vụ) tôi nên nhưng MAPPING tất cả dtos của tôi để có phần đối tượng lớp truy cập (tất nhiên bằng cách sử dụng automapper! !)

Lựa chọn khác của tôi là tiếp tục sử dụng DTOS như đối tượng lớp và chuyển chúng từ phương thức này sang phương thức khác và kiểu trả về vv nhưng tôi cảm thấy điều này là không đúng và tôi tiếp tục đi vòng tròn nên áp dụng?

Bất kỳ sự giúp đỡ thực sự đánh giá cao

nhờ

Trả lời

5

Đây là ý kiến ​​của tôi: Khi giao dịch với bất kỳ ứng dụng không có trival nào. Sử dụng các đối tượng linq2Sql của bạn làm mô hình miền của bạn thực sự là một ý tưởng tồi. Tôi thấy linq2Sql như một ORM và không có gì hơn. Cơ sở dữ liệu (mà linq2Sql có tương ứng trực tiếp) là một sự chuẩn hóa của dữ liệu. Các lớp học (theo nghĩa OOAD) là sự chuẩn hóa của hành vi (không phải dữ liệu).

[các đối tượng lớp là về cơ bản là một hình ảnh phản chiếu] ...

tôi gặp phải điều này khi xây dựng các ứng dụng với Linq2Sql. Cho phép thực tế .... hầu hết các ứng dụng kinh doanh đều là ứng dụng CRUD được tôn vinh. Vì vậy, nó không nằm ngoài câu hỏi rằng một tỷ lệ lớn các thực thể của ứng dụng của bạn sẽ tương ứng trực tiếp với các bảng cơ sở dữ liệu. Tôi không muốn bị ràng buộc trực tiếp vào DTO đã được tạo ra, nhưng đồng thời tôi không muốn các lớp trùng lặp được phân tán trên ứng dụng của tôi.

Vì vậy, đây là giải pháp của tôi:
Tôi "được lập trình cho giao diện".

Cho phép nói rằng tôi có một PersonDto (Dto đứng cho đối tượng chuyển dữ liệu) với các thuộc tính của FirstName, LastName, Age (có liên quan trực tiếp đến cột cơ sở dữ liệu).

Tôi đã tạo giao diện IPerson và đã để PersonDto triển khai giao diện.

 

    [Table(Name="Persons")] 
    internal class PersonDto : IPerson 
    { 
     .... 
    } 
 

Và phương pháp kho của tôi sẽ đưa vào và lấy IPerson như trái ngược với lớp Linq2Sql.

 

    IPerson somePerson = _repository.Get(someGuid); 
    somePerson.FirstName = "SomeName"; 
    _repository.Save(somePerson); 
 

Cách tiếp cận này đã làm việc thực sự tốt cho tôi. Bất cứ khi nào tôi cảm thấy tôi cần phải đi chệch khỏi DTO, tôi có thể làm như vậy khá dễ dàng vì giao diện đại diện cho đối tượng của tôi như trái ngược với DTO.

Một số gợi ý chung: Xây dựng DTO của bạn bằng tay ... Tôi biết nó nghe có vẻ điên rồ, nhưng bạn sẽ thấy nó hoạt động thực sự tốt với phương pháp phát triển thử nghiệm trên xuống. Các đối tượng DTO (linq2Sql) của bạn sẽ cực kỳ nhẹ và sẽ mở ra cho những thay đổi bên ngoài trình thiết kế .dbml.

Giữ nội bộ của DTO và DataContext. Không có lý do nào để dto của bạn được hiển thị công khai (với điều kiện bạn có giao diện công khai cho kho lưu trữ và đối tượng miền). Làm điều này sẽ buộc một sự tách biệt hợp lý giữa mô hình miền của bạn và truy cập dữ liệu.

Đặt tất cả lớp truy cập dữ liệu của bạn vào một dự án riêng biệt (một lần nữa để thực thi việc tách này).

Đặt các khai báo giao diện của bạn trong một dự án riêng biệt (điều này sẽ đảm bảo bạn không chạy vào bất kỳ tham chiếu vòng tròn nào).

Hope this helps ...

+0

Tôi thích ý tưởng này ... vấn đề duy nhất là trong MVC, các bộ điều khiển không thể đưa vào giao diện cho các phương thức thêm. Điều này làm cho các giao diện tương đối vô ích đối với MVC. Làm thế nào bạn xử lý vấn đề này, bởi vì tôi thực sự muốn làm điều này. –

+0

thêm phương thức? bạn có thể xây dựng, tôi hiện đang sử dụng thẩm định này với aspmvc và không có bất kỳ vấn đề. – Amir

+0

"bộ điều khiển không thể đưa vào giao diện cho các phương pháp thêm", chỉ cần tạo một mô hình xem thực hiện giao diện. Nó có thể nằm trong dự án web vì nó chỉ là một đối tượng để giúp tạo điều kiện tương tác với Chế độ xem. – Amir

2

Đây là một trong các cuộc thảo luận tốt nhất của chủ đề mà tôi đã nhìn thấy:

http://blog.wekeroad.com/blog/linqtosql-momma-said-knock-you-out/

Trong quyết định cuối, khớp nối và gắn kết là tình huống và bạn phải quyết định điều gì là tốt nhất cho tình huống của bạn.

Khi ứng dụng của bạn phát triển LinqToSql, làm thế nào nó sẽ được dễ dàng để yank ra LinqToSql và chèn một ORM ở vị trí của nó? Đó là điều mà bạn phải suy nghĩ nghiêm túc.

Nói chung, hãy giảm thiểu kiến ​​thức mà lớp doanh nghiệp của bạn có về LinqToSql. LinqToSql nên được ẩn hoàn toàn khỏi lớp giao diện người dùng của bạn (lớp kinh doanh của bạn tạo nên một đoạn tốt của lá chắn này). Nó rất dễ dàng để đi xuống con đường kiến ​​trúc sai với LinqToSql và nó có thể rất khó khăn để có được trở lại trên con đường bên phải sau khi thực tế.

0

Các lớp được tạo bởi trình thiết kế LINQ2sql là các lớp từng phần, vì vậy bạn có thể mở rộng các lớp này và đặt logic nghiệp vụ của bạn trực tiếp vào chúng. Ý tưởng là linq được sử dụng để duy trì/tái tạo lại các thực thể này để bạn có thể tránh được loại ánh xạ mà bạn đang nói đến.

+1

Khi bạn bắt đầu nhúng logic kinh doanh vào các lớp học phần LinqToSql, nó là rất khó khăn để tách chúng sau này. Nếu bạn không muốn/cần một lớp kinh doanh, đó là tốt, nhưng đó không phải luôn luôn là cách chính xác để đi. Ngoài ra, thật khó để thay thế LinqToSql bằng một ORM khác với một tính năng khác được đặt tại một số điểm trong tương lai (có thể hoặc không cần thiết). –

+0

Vấn đề là, các thực thể linqToSql của bạn là một phần của 'lớp nghiệp vụ' và kho lưu trữ được sử dụng để tìm nạp/lưu giữ chúng trong databaase. Có một số liên kết với nhà thiết kế LINQ nhưng đó là một vấn đề khác. – Lee

+0

@Lee: không, bạn không nên sử dụng linq2sql cho lớp doanh nghiệp của bạn. Đó là một người lập bản đồ quan hệ WONDERFUL, nhưng tôi mạnh mẽ khuyến khích bạn không rơi vào cái bẫy đó. Cơ sở dữ liệu của bạn là việc chuẩn hóa dữ liệu, lớp doanh nghiệp của bạn là sự bình thường hóa các hành vi. – Amir

3

Tôi thực sự có câu hỏi tương tự về chủ đề này mặc dù ý định của tôi hơi khác một chút. Đề nghị là sử dụng các lớp Linq2SQL như các đối tượng miền và tận dụng lợi thế của các lớp một phần như những người khác đã đề cập. Mối quan tâm chính của tôi đến với hình dạng của các đối tượng đó (ví dụ: tên thuộc tính) và khả năng truy cập của các thành viên lớp (ví dụ: v.s.vật tư được bảo vệ chẳng hạn).

Hình dạng của đối tượng và thậm chí khả năng truy cập có thể được giải quyết bằng cách sử dụng mẫu t4 nơi Damien Guard đã đặt cùng mẫu T4 để cho phép bạn kiểm soát hình dạng của các lớp mà Linq2Sql sẽ tạo cho bạn. Điều này có thể được nhìn thấy ở đây T4 template for Linq2SQL.

Đây là cách tiếp cận mà tôi sẽ xem xét và xem liệu nó có đề cập đến mối quan ngại của tôi hay không. Ngoài ra, nếu lớp dịch vụ của bạn có thể chấp nhận các giao diện cho các đối số phương thức, bạn cũng có thể kiểm soát những gì mà lớp dịch vụ có thể truy cập thông qua các trình bao bọc giao diện xung quanh các DTO Linq2SQL của bạn.

Hy vọng điều này sẽ hữu ích.