Việc xê-ri hóa có ngăn cản việc sử dụng Tiêm phụ thuộc không?


9

Câu hỏi đơn giản: Tôi hiểu rằng Tuần tự hóa trong C # yêu cầu các hàm tạo mặc định. Điều này sẽ loại bỏ khả năng sử dụng Con constructor được tiêm DI (thường là phong cách ưa thích của DI, trong bài đọc của tôi [cần dẫn nguồn] ). Vì vậy, nó thực sự là một hoặc một tình huống, hoặc tôi đang thiếu một cái gì đó?

(Câu hỏi bên lề): Các container IoC có thực hiện bước đánh đổi này bằng cách nào đó không?


This would eliminate the possibility of using Constructor injected DI-- Tại sao? Bạn vẫn có thể có các trình hướng dẫn được tham số hóa, miễn là bạn bao gồm một hàm tạo mặc định cho các mục đích tuần tự hóa (hàm tạo mặc định có thể là riêng tư, nếu bạn muốn).
Robert Harvey

@RobertHarvey: Tôi cảm thấy hơi dày đặc, nhưng tôi không hiểu bạn lắm. "Người hướng dẫn tham số" là gì? (typo?) Một khi một đối tượng đã được khử nối tiếp, tôi không thể xây dựng lại nó. Bạn đang đề nghị tôi sử dụng thuộc tính / setter tiêm trên một đối tượng được cấu trúc mặc định?
kmote 18/03/2016

1
Một constructor tham số là một với các tham số. Tôi giả sử ở đây rằng khử lưu huỳnh xảy ra từ dữ liệu được lấy từ một đối tượng được xây dựng chính xác bằng cách sử dụng phép nội xạ phụ thuộc. Bạn không phải xây dựng đối tượng trong quá trình khử lưu huỳnh; nó đã được xây dựng trước đó.
Robert Harvey

1
Không, bạn không nhầm. Đó là cách nó hoạt động. Hãy nghĩ về nó như tiêm cửa sau. Bạn sẽ không nhận được bất kỳ xác nhận, nhưng nó sẽ hoạt động. Lưu ý rằng BinaryFormatter và DataContractSerializer không yêu cầu các hàm tạo mặc định.
Robert Harvey

1
Để rõ ràng, tất cả quá trình khử lưu huỳnh thực hiện là điền vào trạng thái trong đối tượng của bạn với các giá trị được chỉ định trong đối tượng XML. Nó sử dụng Reflection để thực hiện điều này và bỏ qua mọi dạng logic xác thực của hàm tạo, do đó, theo quan điểm của DI, nó là gian lận, trừ khi các giá trị XML ban đầu đến từ một đối tượng được xây dựng thông qua DI thông thường.
Robert Harvey

Câu trả lời:


6

Không thể khử tuần tự hóa một đối tượng và cũng có thể thêm một phụ thuộc vào một đối tượng khác, đã tồn tại, trong một bước trong C #, sử dụng các cơ chế tuần tự hóa tiêu chuẩn. Thay vào đó, bạn sẽ phải sử dụng thuộc tính tiêm, trước tiên, xây dựng đối tượng bằng cách sử dụng trình giải nén, sau đó tiêm phụ thuộc. Đối với hầu hết các ứng dụng trong thế giới thực, tôi không coi điều này là một nhược điểm thực sự - nếu bạn có một lớp mô hình dữ liệu có thể tuần tự hóa, nó cũng phụ thuộc vào các lớp mô hình phi dữ liệu khác, bạn nên kiểm tra xem lớp mô hình dữ liệu của bạn có thể có quá nhiều trách nhiệm rồi

Nếu điều đó thực sự làm phiền bạn, bạn có thể xem xét bọc đối tượng tuần tự hóa của mình bằng một lớp trang trí, nơi bạn có thể truyền trình khử nối tiếp và các phụ thuộc bổ sung thông qua hàm tạo. Sau đó, trình bao bọc đó thực hiện hai bước (khử tuần tự hóa đối tượng được bọc và tiêm thuộc tính) trong hàm tạo của nó.


1

Tôi đang giải quyết vấn đề này như thế: tiêm các nhà máy phụ thuộc. Trong các nhà máy đó, trước tiên, giải quyết sự phụ thuộc khi nó được đăng ký trong vùng chứa, sau đó "khử lưu lượng hóa" tất cả dữ liệu còn lại: json.net cho phép điền vào các trường trong đối tượng hiện có.

Vì mã nhà máy đi cùng với mã dây của bộ chứa IoC, tôi không nghĩ việc sử dụng container.Resolvebên trong nhà máy vi phạm quy tắc, mà containerphải được sử dụng chỉ ở một nơi trong mã: nơi tất cả các hệ thống dây điện xảy ra.

Đến bây giờ, tôi đang cố gắng làm cho quá trình này tự động (trái ngược với những gì tôi đã thử nghiệm phương pháp đó tại) bằng cách sử dụng sự phản chiếu. Vâng, không có nhiều thứ còn lại từ chính quá trình khử lưu huỳnh của json.net, một phần của nó được thay thế bằng mã tùy chỉnh, nhưng tôi nghĩ, tại sao phải bận tâm.

Ngoài ra, suy nghĩ / quyết định cuối cùng của bạn về vấn đề này là gì? Sau khi đọc bài này tôi thấy hai cách: deserialize, sau đó tiêm; hoặc tiêm, sau đó khử lưu huỳnh (dân cư). Và tôi vẫn thấy con đường của mình tốt hơn. Sẽ rất vui khi nghe các lập luận phản đối điều này (tôi liên quan, rằng cách của tôi có thể tốt hơn cho trường hợp của tôi, nhưng không thể tưởng tượng một cách sinh động các trường hợp thay thế tốt, khi nó thất bại, chỉ là một số phỏng đoán nhỏ)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.