คำถามติดแท็ก event

10
การบังคับใช้หลักการความรับผิดชอบเดี่ยว
ฉันเพิ่งมาโดยปัญหาสถาปัตยกรรมที่ดูเหมือนเล็กน้อย ฉันมีพื้นที่เก็บข้อมูลอย่างง่ายในรหัสของฉันที่ถูกเรียกเช่นนี้ (รหัสเป็น C #): var user = /* create user somehow */; _userRepository.Add(user); /* do some other stuff*/ _userRepository.SaveChanges(); SaveChanges เป็น wrapper ง่ายๆที่ยอมรับการเปลี่ยนแปลงในฐานข้อมูล: void SaveChanges() { _dataContext.SaveChanges(); _logger.Log("User DB updated: " + someImportantInfo); } หลังจากนั้นครู่หนึ่งฉันจำเป็นต้องใช้ตรรกะใหม่ที่จะส่งการแจ้งเตือนทางอีเมลทุกครั้งที่ผู้ใช้ถูกสร้างขึ้นในระบบ เนื่องจากมีการโทรเข้า_userRepository.Add()และออกSaveChangesจากระบบจำนวนมากฉันจึงตัดสินใจอัปเดตSaveChangesดังนี้: void SaveChanges() { _dataContext.SaveChanges(); _logger.Log("User DB updated: " + someImportantInfo); foreach (var newUser …

3
API Gateway (REST) ​​+ Microservices ที่ขับเคลื่อนด้วยเหตุการณ์
ฉันมี microservices มากมายที่มีฟังก์ชั่นที่ฉันเปิดเผยผ่าน REST API ตามรูปแบบเกตเวย์ API เนื่องจาก microservices เหล่านี้เป็นแอปพลิเคชั่น Spring Boot ฉันจึงใช้ Spring AMQP เพื่อให้เกิดการสื่อสารแบบซิงโครนัสสไตล์ RPC ระหว่างไมโครไซต์เหล่านี้ สิ่งต่าง ๆ ราบรื่นไปแล้ว อย่างไรก็ตามยิ่งฉันอ่านเกี่ยวกับสถาปัตยกรรม microservice ที่ขับเคลื่อนด้วยเหตุการณ์มากขึ้นและดูโครงการเช่น Spring Cloud Stream ยิ่งฉันเชื่อมั่นมากขึ้นว่าฉันอาจทำสิ่งที่ผิดกับ RPC วิธีการแบบซิงโครนัส เพื่อตอบสนองการร้องขอนับร้อยหรือพันต่อวินาทีจากแอปพลิเคชันไคลเอนต์) ฉันเข้าใจจุดหลังสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ สิ่งที่ฉันไม่ค่อยเข้าใจคือวิธีการใช้รูปแบบดังกล่าวจริงเมื่อนั่งอยู่ข้างหลังแบบจำลอง (REST) ​​ที่คาดว่าจะตอบสนองต่อทุกคำขอ ตัวอย่างเช่นถ้าฉันมีเกตเวย์ API เป็น microservice และอีกบริการหนึ่งที่เก็บและจัดการผู้ใช้ฉันจะสร้างแบบจำลองเช่นGET /users/1ในเหตุการณ์ที่ขับเคลื่อนด้วยเหตุการณ์ได้อย่างหมดจดได้อย่างไร

3
DDD: จะวางตัวจัดการเหตุการณ์ของโดเมนได้ที่ไหน
คุณช่วยบอกความเห็นของคุณว่าเลเยอร์ตัวไหนที่ถูกต้องในการวางตัวจัดการเหตุการณ์ของโดเมนใน DDD ตัวอย่างเช่นฉันมีบริการแอปพลิเคชันเพื่อเพิ่มสัญญาใหม่และฉันต้องการส่งการแจ้งเตือนทางอีเมลไปยังบุคคลที่ติดต่อเมื่อมีการเพิ่มสัญญาดังนั้นผู้ส่งอีเมล (ที่จัดการกับ ContractAdded) แอปพลิเคชันบริการหรือบริการโดเมนหรือ อื่น ๆ อีก?

2
วิธีการตรวจสอบว่าข้อความควรเป็นข้อความคำสั่งหรือข้อความเหตุการณ์?
สองรูปแบบรวมกิจการเป็นข้อความคำสั่งและข้อความเหตุการณ์ ฉันกำลังทำงานกับระบบที่เราใช้การส่งข้อความไม่เพียง แต่สำหรับการรวมเข้ากับระบบอื่น ๆ แต่สำหรับการสื่อสารภายในระหว่างบริการ มันควรจะเป็นระบบที่สอดคล้องกันในที่สุดและบริการต่าง ๆ ควรจะไม่รู้ซึ่งกันและกัน (ยกเว้นบริการพิเศษที่มีวัตถุประสงค์เฉพาะสองสามข้อ) เช่นนี้เราพยายามหลีกเลี่ยงสิ่งที่รู้สึกเหมือนการเรียกขั้นตอนระยะไกล (RPC หรือ RPI) เรามีระบบบัสและมิดเดิลแวร์ที่เน้นข้อความและมีการถ่ายทอดข้อความทั้งหมด PurchaseOrderShippedเรามักจะตั้งชื่อข้อความของเราเป็นเหตุการณ์ที่เกิดขึ้นนั่นคือเป็นวลีในที่สมบูรณ์แบบที่ผ่านมาเช่น อย่างไรก็ตามเหตุการณ์มักจะถูกเพิ่มเฉพาะเมื่อบริการอื่น ๆ จำเป็นต้องรู้เกี่ยวกับพวกเขาและในการเริ่มต้นมักจะมีเพียงหนึ่งบริการที่ใส่ใจ ยิ่งไปกว่านั้นบางครั้งบริการก็ส่งเหตุการณ์ออกมาซึ่งเป็นบริการที่รับฟังโดยบริการแรก ดังนั้นถ้าฉันทำแผนภาพการโต้ตอบมันจะดูคล้ายกับแผนภาพสำหรับข้อความคำสั่งในลิงก์ด้านบน (หรือแม้แต่แผนภาพ RPC) มากกว่าข้อความสำหรับข้อความเหตุการณ์ แต่อีกครั้งสิ่งนี้ไม่ได้ถูกนำไปใช้จริง ส่งข้อความโดยตรง แต่ออกอากาศบนรถบัส เพิ่มไปที่ความจริงที่ว่าฉันได้เห็นเมื่อเร็ว ๆ BillShippedPurchaseOrderนี้บางข้อความที่เพิ่มเข้ามาที่มีชื่อเป็นคำสั่งที่เป็นวลีในความจำเป็นที่เช่น สิ่งที่แปลกคือชื่อของข้อความและวิธีที่พวกเขาไหลไม่เปลี่ยนแปลงโดยไม่ว่าจะถูกตั้งชื่อเป็นเหตุการณ์หรือเป็นคำสั่ง ดังนั้นหนึ่งจะกำหนดว่าสิ่งที่ควรเป็นข้อความคำสั่งหรือเหตุการณ์? นี่เป็นเพียงความแตกต่างของความหมายและการตั้งชื่อหรือมีความแตกต่างที่เกิดขึ้นจริงระหว่างคำสั่งและข้อความเหตุการณ์หรือไม่ ระบุว่าข้อความทั้งหมดของเราออกอากาศแล้วนั่นหมายความว่าไม่มีใครเป็นผู้สั่งข้อความอย่างแท้จริงหรือไม่?

2
ผู้ส่งเหตุการณ์ควรเป็นวัตถุทั่วไปหรือไม่
เมื่อกิจกรรมการเขียนโปรแกรมใน C # ขอแนะนำให้สร้างผู้แทนในรูปแบบของ: delegate XEventHandler(object sender, XEventArgs e); คำถามของฉันอยู่ที่อาร์กิวเมนต์แรกของผู้รับมอบสิทธิ์object sender. มันจำเป็นต้องเป็นยาสามัญobjectหรือไม่? การมีผู้ส่งเป็นประเภทobjectจะส่งผลให้เกิดรหัสคล้ายกัน val = ((ConcreteType)sender).Property; หรือยิ่ง verbose ConcreteType obj = sender as ConcreteType if (obj != null) { ... } ข้อโต้แย้งอย่างหนึ่งสำหรับผู้ส่งที่พิมพ์อย่างรุนแรงคือวัตถุอื่น ๆ สามารถส่งต่อเหตุการณ์โดยไม่ต้องกังวลเกี่ยวกับประเภท แม้ว่าสิ่งนี้อาจสมเหตุสมผลในสภาพแวดล้อม GUI แต่ฉันไม่แน่ใจว่าจะได้ประโยชน์นอก GUI หรือไม่ ถ้าคลาสของผู้ส่งเป็นที่รู้จักกันเสมอ (อย่างน้อยก็เป็นคลาสนามธรรม)? ตัวอย่างเช่นถ้าฉันกำลังดำเนินการListChangedจัดกิจกรรมในนามธรรมListชั้นและถ้าชั้นเรียนอื่น ๆ จะได้รับมรดก (เช่นLinkedList, ArrayList) มันเป็นสิทธิ์ที่จะกำหนดผู้รับมอบสิทธิ์ของฉันที่มีผู้ส่งประเภทList? delegate ListChangedEventHander(List sender, …
10 c#  event 

2
ผู้ฟังเหตุการณ์ควรจัดขึ้นในการอ้างอิงที่อ่อนแอ?
โดยทั่วไปผู้ฟังเหตุการณ์ไม่ควรอยู่เหนือกว่าวัตถุที่ลงทะเบียนไว้ หมายความว่าผู้ฟังเหตุการณ์ควรจัดขึ้นโดยการอ้างอิงที่อ่อนแอตามค่าเริ่มต้น (เก็บไว้ในคอลเลกชันที่อ่อนแอโดยผู้ฟังวัตถุที่ลงทะเบียนไว้) มีกรณีที่ถูกต้องหรือไม่เมื่อผู้ฟังควรมีอายุยืนกว่าผู้สร้าง หรืออาจเป็นเช่นนั้นเป็นความผิดพลาดและไม่ควรอนุญาต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.