Đâ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 ...
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. –
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
"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