2010-08-27 26 views
8

Khi di chuyển ngang qua các lớp, nó rất tẻ nhạt để thực hiện đúng-> các bài tập trái như một cách để điền các mô hình. Ví dụ:Sao chép các mô hình giữa các lớp

employeeViewModel.FirstName = employeeModel.FirstName; 
employeeViewModel.LastName = employeeModel.LastName; 
... 

Vì vậy, chúng ta có thể xây dựng một ModelCopier trong đó sử dụng phản ánh để sao chép mô hình:

var employeeViewModel = ModelCopier.Copy<EmployeeViewModel>(employeeModel); 

Kỹ thuật này rất đơn giản hoá công việc. Tuy nhiên, có một vài điều khá đáng lo ngại về điều này:

  • Chúng tôi đã mất khả năng theo dõi việc sử dụng các thuộc tính trên đối tượng nguồn và đích. Ví dụ, việc tìm kiếm các tập quán (trong Resharper) của thuộc tính FirstName không tiết lộ các trường hợp ModelCopier.
  • Nếu chúng tôi thay đổi tên của thuộc tính trên lớp nguồn hoặc đích, chúng tôi vô tình có thể gây ra ngoại lệ thời gian chạy vì chúng tôi có thể không nhận ra rằng chúng tôi cần cập nhật cả lớp nguồn và đích.

Trên một đầu của quang phổ, chúng tôi có thể sử dụng sự phản chiếu rất dễ dàng, nhưng với chi phí bảo trì. Sự kết thúc ngược lại của quang phổ rất tẻ nhạt nhưng rất dễ bảo trì.

Reflection (Dễ dàng và nguy hiểm) < -----> Chuyển nhượng trực tiếp (tẻ nhạt và dễ bảo trì)

tôi tò mò nếu có ai đã tìm ra một thỏa hiệp mà cung cấp sự dễ dàng của việc sử dụng phản ánh để sao chép với khả năng bảo trì của nhiệm vụ trực tiếp.

Một giải pháp mà chúng tôi đã giải trí là xây dựng một plugin sẽ tạo ra các phương pháp mở rộng xử lý việc gán thuộc tính cho từng trường hợp. Nói cách khác, xây dựng một công cụ sẽ xử lý phần tẻ nhạt.

EDIT:

Hãy hiểu rằng câu hỏi này không phải là về những công cụ lập bản đồ để sử dụng. Tôi đang cố gắng hiểu cách chúng ta có thể tận hưởng những lợi ích của ánh xạ dựa trên sự phản chiếu trong khi cũng tận hưởng những lợi ích của tính bảo trì được cung cấp bởi sự phân công trực tiếp (hoặc hợp đồng bản đồ tài sản).

Trả lời

3

Có lẽ trình biên dịch không thực hiện kiểm tra cần thiết trên toàn bộ mã ... đó là nơi thử nghiệm đơn vị có trong tay. Nếu bạn đã xác định một thử nghiệm cho việc chuyển đổi giữa các lớp trong các lớp khác nhau (có, tất cả các chuyển đổi khả năng bạn cần thực hiện, nếu không bạn có thể chắc chắn rằng cách tiếp cận phản chiếu của bạn sẽ hoạt động trong mọi tình huống một lần trong sản xuất?), chỉ cần chạy thử nghiệm sẽ thông báo cho nhà phát triển đã thay đổi tên thuộc tính, rằng giải pháp không còn vượt qua tất cả các thử nghiệm nữa. Bạn nên chạy mọi thử nghiệm (kiểm tra đơn vị, không thử nghiệm tích hợp) mỗi khi bạn muốn kiểm tra mã nguồn của mình ... và không nên là một vài tháng mã hóa :))

Vì vậy, tôi thực sự bỏ phiếu cho việc sử dụng cách tiếp cận phản chiếu, cay với một thìa phương pháp thử nghiệm đơn vị.

+0

@themarcuz - Tôi đồng ý, một loạt các bài kiểm tra đơn vị sẽ bắt được vấn đề. Trong khi thảo luận về vấn đề này, chúng tôi đã đưa vấn đề này lên và điều gây khó chịu chính là nó phụ thuộc vào việc kiểm tra đơn vị đang được thực hiện. Có lẽ câu trả lời tốt nhất là đảm bảo chúng tôi có các bài kiểm tra đơn vị kiểm tra rõ ràng hoạt động lập bản đồ. Nó vẫn sẽ là tốt đẹp nếu chúng ta có thể bắt vấn đề tại thời gian biên dịch. –

+1

@Page Brooks - Theo định nghĩa trình biên dịch chạy qua mã bạn đã viết. Vì vậy, cách duy nhất để cho nó thực hiện kiểm tra bạn cần là viết mã (bằng tay hoặc với một plug-in VS như bạn đã nêu trước đó). Không có lựa chọn nào khác: - bạn muốn kiểm tra mã tại thời gian biên dịch -> bạn viết mã (đó là những gì bạn muốn tránh) - bạn muốn tránh viết mã -> bạn kiểm tra chức năng kiểm tra trình biên dịch (nhưng bạn không muốn điều này nữa) Nhưng những gì bạn phải đạt được là để tránh một số bản cập nhật kích hoạt lỗi trong thời gian chạy: cải thiện hành vi thử nghiệm của nhóm của bạn là cách tốt nhất, IMHO – themarcuz

+1

Craig Lairman sugest để check-in mọi 30 phút ... nhưng hãy nói một giờ ... và bạn phải chạy tất cả bài kiểm tra trước khi đăng ký. Vì vậy, không có quá nhiều chỗ cho loại lỗi đó. Tôi biết rằng đó không phải là chứng minh của khỉ như trình biên dịch, nhưng đó là giải pháp tốt nhất – themarcuz

10

Nghiêm túc, sử dụng AutoMapper. Nó cho phép bạn thiết lập chuyển đổi từ loại này sang loại khác. Bất kỳ thay đổi tên bất động sản sẽ phá vỡ các cấu hình của automapper, mà phản ánh sẽ không:

Mapper.CreateMap<SiteDto, SiteModel>(); 
Mapper.CreateMap<SiteModel, SiteDto>(); 

Sau đó, để ánh xạ đến và đi từ, bạn chỉ cần làm như sau:

SiteDto dto = Mapper.Map<SiteModel, SiteDto>(targetModel); 
SiteModel model = Mapper.Map<SiteDto, SiteModel>(targetDto); 
+2

Trình ánh xạ tự động là cách để đảm bảo. nó thật tuyệt! – Patricia

+0

Chúng tôi đã đi xuống tuyến đường AutoMapper. Vấn đề chúng tôi đã tìm thấy với AutoMapper là trong các ứng dụng quy mô lớn, bạn sẽ phải viết rất nhiều bản đồ thuộc tính. Tôi không phản đối việc có nhiều bản đồ tài sản, nhưng nếu chúng tôi có thứ gì đó có thể hỗ trợ cho việc tạo bản đồ ban đầu thì sẽ hiệu quả hơn nhiều. –

+1

Đây là những lời chỉ trích kỳ quặc của Automapper. Nếu bạn làm theo một cách tiếp cận dựa trên quy ước để đặt tên nó sẽ giúp bạn tiết kiệm rất nhiều thời gian. Nếu bạn viết tấn mã bản đồ với automapper thì bạn làm điều gì đó sai. Thật kỳ quặc khi có các lớp "có thể thay đổi" với tên thuộc tính hoàn toàn khác. – jfar

0

Một cách sẽ được viết một tiện ích riêng biệt sử dụng sự phản chiếu để lấy tên của các thuộc tính từ mô hình và sau đó viết mã nguồn để lộ các thuộc tính.

+0

Chúng tôi đã xem xét cách tiếp cận này. Nhưng chúng tôi muốn tránh việc phụ thuộc vào một công cụ riêng biệt nếu có thể. Tôi vẫn nghĩ rằng đây là một lựa chọn tuy nhiên. –

1

tôi tò mò nếu có ai đã tìm thấy một sự thỏa hiệp cung cấp sự dễ dàng của sử dụng phản ánh để sao chép với trì giao trực tiếp.

Có vẻ như bạn đang cố gắng ăn bánh và ăn.

Đây là vấn đề mà ngôn ngữ động phải đối mặt hàng ngày. Không có viên thuốc kỳ diệu. Hoặc là thực hiện các nhiệm vụ tay trái và nhận được sự bảo vệ của trình biên dịch hoặc bọc các bài tập quan trọng của bạn trong các bài kiểm tra đơn vị.

Đường ruột của tôi cho tôi biết đây là vấn đề về thiết kế chứ không phải vấn đề về mã.

+0

Tôi chắc chắn đang cố gắng để có chiếc bánh của tôi và ăn nó! Bạn có thể giải thích tại sao nó có thể là một vấn đề thiết kế? Có lẽ chúng ta đang làm một cái gì đó mà chúng ta có thể tránh hoàn toàn? Cảm ơn bạn đã giúp đỡ! –

0

yêu cầu của bạn vượt quá thời gian chạy (thực hiện) như vậy vì bạn (và tất cả chúng ta) cần biểu đồ phụ thuộc, v.v. Điều này có nghĩa là khám phá động với sự phản chiếu đã hết. Bạn dường như cần giải pháp biên dịch. Ngoài đề xuất của @ amaca về trình cắm thêm tạo mã (bạn có thể viết dễ dàng), các tùy chọn khác có thể có ở đâu?

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