การทำให้เป็นอันดับทำให้การใช้การฉีดพึ่งพาหรือไม่


9

คำถามง่าย ๆ : ฉันเข้าใจว่าการทำให้เป็นอันดับใน C # ต้องใช้ตัวสร้างเริ่มต้น นี้จะขจัดความเป็นไปได้ของการใช้สร้างฉีด DI (ซึ่งโดยทั่วไปคือสไตล์ที่ชื่นชอบของ DI ในการอ่านของฉัน[อ้างจำเป็น] ) ดังนั้นมันจึงเป็นเหตุการณ์หรือสถานการณ์จริง ๆ หรือฉันกำลังทำอะไรบางอย่างหายไป?

(คำถามด้านข้าง): IoC ทำหน้าที่บรรจุขั้นตอนนี้หรือไม่?


This would eliminate the possibility of using Constructor injected DI- ทำไม คุณยังสามารถมีผู้สอนที่ปรับพารามิเตอร์ได้ตราบใดที่คุณรวม Constructor เริ่มต้นสำหรับการทำให้เป็นอนุกรม (Constructor เริ่มต้นสามารถเป็นส่วนตัวได้หากคุณต้องการ)
Robert Harvey

@ RobertHarvey: ฉันรู้สึกหนาแน่นเล็กน้อย แต่ฉันก็ไม่ได้รับคุณ "ผู้สอนแบบกำหนดพารามิเตอร์" คืออะไร (พิมพ์ผิด?) เมื่อวัตถุได้รับการทำให้เป็นอนุกรมฉันไม่สามารถสร้างได้อีก คุณแนะนำให้ฉันใช้การฉีดพร็อพเพอร์ตี้ / เซ็ตเตอร์กับวัตถุที่มีโครงสร้างเป็นค่าเริ่มต้นหรือไม่
kmote

1
คอนสตรัคพารามิเตอร์เป็นหนึ่งที่มีพารามิเตอร์ ฉันสมมติว่าที่นี่ deserialization เกิดขึ้นจากข้อมูลที่มาจากวัตถุที่สร้างขึ้นอย่างถูกต้องโดยใช้การฉีดพึ่งพา คุณไม่จำเป็นต้องสร้างวัตถุระหว่างการดีซีเรียลไลเซชัน มันถูกสร้างขึ้นมาก่อนแล้ว
Robert Harvey

1
ไม่คุณไม่เข้าใจผิด มันเป็นวิธีการทำงาน คิดว่ามันเป็นการฉีดประตูหลัง คุณจะไม่ได้รับการตรวจสอบ แต่จะใช้งานได้ โปรดทราบว่า BinaryFormatter และ DataContractSerializer ไม่ต้องการตัวสร้างเริ่มต้น
Robert Harvey

1
เพื่อให้ชัดเจนการดีซีเรียลไลซ์เซชั่นทั้งหมดจะเติมสถานะในวัตถุของคุณด้วยค่าที่ระบุในวัตถุ XML มันใช้ Reflection เพื่อทำให้สิ่งนี้บรรลุผลและข้ามตรรกะการตรวจสอบคอนสตรัคเตอร์รูปแบบใด ๆ ดังนั้นจากมุมมองของ DI มันเป็นการโกงนอกเสียจากว่าค่า XML นั้นมาจากวัตถุที่สร้างผ่าน DI ธรรมดา
Robert Harvey

คำตอบ:


6

มันเป็นไปไม่ได้ที่จะยกเลิกการทำให้เป็นอันดับวัตถุและยังฉีดการอ้างอิงไปยังวัตถุอื่นที่มีอยู่แล้วในขั้นตอนเดียวใน C # โดยใช้กลไกการทำให้เป็นอนุกรมมาตรฐาน คุณจะต้องใช้การฉีดคุณสมบัติแทนก่อนสร้างวัตถุโดยใช้ deserializer หลังจากนั้นทำการฉีดการพึ่งพา สำหรับแอปพลิเคชันส่วนใหญ่ในโลกแห่งความเป็นจริงฉันไม่พิจารณาข้อบกพร่องนี้จริง ๆ หากคุณมีคลาสโมเดลข้อมูลแบบอนุกรมซึ่งสามารถพึ่งพาคลาสคลาสอื่น ๆ ที่ไม่ใช่ข้อมูลได้คุณควรตรวจสอบว่าคลาสโมเดลข้อมูลของคุณอาจมี มีความรับผิดชอบมากเกินไป

หากสิ่งนั้นรบกวนจิตใจคุณจริงๆคุณอาจพิจารณาห่อวัตถุที่ต่อเนื่องของคุณกับคลาสมัณฑนากรซึ่งคุณสามารถผ่าน de-serializer และการพึ่งพาเพิ่มเติมผ่านตัวสร้าง wrapper นั้นจะดำเนินการสองขั้นตอน (การทำให้เป็นอันดับของวัตถุที่ถูกห่อและการฉีดคุณสมบัติ) ใน Constructor


1

ฉันกำลังแก้ปัญหาเช่นนี้: ฉีดโรงงานที่ต้องพึ่งพา ในโรงงานเหล่านั้นก่อนอื่นให้แก้ไขการพึ่งพาเนื่องจากมีการลงทะเบียนในคอนเทนเนอร์แล้ว "ดีซีเรียลไลซ์" ข้อมูลที่เหลือทั้งหมด: json.net อนุญาตให้เติมฟิลด์ในวัตถุที่มีอยู่

เมื่อรหัสโรงงานไปพร้อมกับรหัสการเดินสายของคอนเทนเนอร์ IoC ฉันไม่คิดว่าการใช้งานcontainer.Resolveภายในโรงงานละเมิดกฎที่containerต้องใช้ในที่เดียวในรหัส: การเดินสายทั้งหมดเกิดขึ้น

ณ ตอนนี้ฉันกำลังพยายามทำให้กระบวนการนี้เป็นแบบอัตโนมัติ (ซึ่งต่างกับสิ่งที่ฉันกำลังทดสอบวิธีการนั้น) โดยใช้การไตร่ตรอง ใช่มีไม่มากที่เหลืออยู่จากการดีซีเรียลไลเซชั่นของ json.net ตัวเองส่วนหนึ่งของมันถูกแทนที่ด้วยรหัสที่กำหนดเอง แต่ฉันคิดว่าทำไมต้องรำคาญ

อะไรคือความคิด / การตัดสินใจขั้นสุดท้ายของคุณเกี่ยวกับเรื่องนี้ หลังจากอ่านโพสต์นี้ฉันเห็นสองวิธี: deserialize แล้วฉีด; หรือฉีดจากนั้นยกเลิกการซีเรียลไลซ์ (เติมข้อมูล) และฉันก็ยังพบว่าวิธีของฉันดีกว่า ยินดีที่จะได้ยินข้อโต้แย้งที่ขัดแย้งกับสิ่งนี้ (ฉันเกี่ยวข้องกับวิธีการของฉันอาจดีกว่าสำหรับกรณีของฉัน แต่ไม่สามารถจินตนาการกรณีทางเลือกที่ดีที่มันล้มเหลวได้เพียงเดาเล็กน้อย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.