ฉันกำลังมองหาการสร้างโซลูชันใหม่ที่เป็นแบบแยกส่วนโดยธรรมชาติและต้องการสร้างโครงสร้างที่รองรับการออกแบบนั้นเพื่อให้สามารถขยายตัวในอนาคตได้อย่างง่ายดายแยกข้อกังวลออกใบอนุญาตโดยโมดูล ฯลฯ สิ่งที่ฉันทำส่วนใหญ่คือ พบได้บนเว็บเกี่ยวกับแอปพลิเคชันแบบแยกส่วนหรือคอมโพสิตคือ UI เป็นศูนย์กลางมุ่งเน้นไปที่ Silverlight, WPF และอื่น ๆ ในกรณีของฉันฉันกำลังพัฒนาแอพพลิเคชั่นบริการ WCF ที่นักพัฒนาอื่น ๆ
พื้นหลัง
เป้าหมายของโครงการของฉันคือการสร้างแหล่งที่มาแบบรวมศูนย์ของตรรกะทางธุรกิจ / โดเมนเพื่อสนับสนุนแอปพลิเคชันทางธุรกิจของเราหลายอย่างที่กำลังทำซ้ำกระบวนการกฎและอื่น ๆ และแม้ว่าจะไม่ได้รับประโยชน์จากโมดูลทั้งหมด โอกาสในการสร้างกรอบที่จะใช้ประโยชน์จากส่วนที่เราสามารถใช้ประโยชน์จาก
ฉันเริ่มต้นการออกแบบโดยดูที่ API ที่เปิดเผยโดยแอปพลิเคชันบริการ เป็นที่ชัดเจนว่าบริการสามารถแยกออกไปตามสายโมดูลาร์ที่ฉันกำลังพิจารณา ตัวอย่างเช่นฉันจะมี FinanceService, InventoryService, PersonnelService และบริการอื่น ๆ ที่จัดกลุ่มการดำเนินงานบริการของฉันเพื่อให้มีการทำงานร่วมกันสูงใน API ในขณะที่การมีเพศสัมพันธ์ต่ำดังนั้นลูกค้าจะต้องใช้บริการที่เกี่ยวข้องกับแอปพลิเคชันของตน
ฉันรู้สึกว่าฉันสามารถมีโมดูลแยกต่างหากสำหรับแต่ละบริการเหล่านี้เช่น MyApp.Finance, MyApp.Inventory, My.Personnel และอื่น ๆ ความกังวลแบบตัดขวางและประเภทที่แชร์จะอยู่ในชุดประกอบ MyApp ที่ใช้ร่วมกัน จากที่นี่ฉันจะได้รับการผูกเล็กน้อย
(โอ้ฉันควรพูดถึงว่าฉันจะใช้คอนเทนเนอร์ IoC สำหรับ Dependency Injection เพื่อให้แอปพลิเคชันมีการเชื่อมต่ออย่างหลวม ๆ ฉันจะไม่พูดถึงสิ่งใดเพราะฉันไม่ต้องการเปิดกล่องแพนดอร่า!)
ใน MyApp.ServiceHost ฉันจะสร้างไฟล์โฮสต์บริการ (.svc) ที่สอดคล้องกับแต่ละโมดูล FinanceService.svc เช่น โฮสต์บริการต้องการชื่อของบริการที่สอดคล้องกับข้อมูลในไฟล์กำหนดค่าที่มีส่วนต่อประสานที่กำหนดสัญญาบริการ จากนั้นการกำหนดค่า IoC จะใช้ในการทำแผนที่การนำอินเตอร์เฟสไปใช้อย่างเป็นรูปธรรม
1. เลเยอร์บริการควรใช้ API และมอบสิทธิ์ให้กับโมดูลหรือโมดูลควรมีอยู่ในตัวเอง (ในนั้นจะมีทุกอย่างที่เกี่ยวข้องกับโมดูลนั้นรวมถึงการใช้งานบริการ)
วิธีหนึ่งในการเข้าถึงปัญหาคือมี "โมดูล" MyApp.Services ซึ่งมีการใช้งานสัญญาบริการ แต่ละคลาสเซอร์วิสจะมอบหมายให้โมดูลอื่นที่เหมาะสมซึ่งมีตรรกะโดเมนสำหรับการดำเนินการ ตัวอย่างเช่นคลาส FinanceService WCF ใน MyApp.Services มอบสิทธิ์ให้แก่อินเทอร์เฟซอื่นซึ่งถูกนำไปใช้ในโมดูลการเงินเพื่อดำเนินการ สิ่งนี้จะช่วยให้ฉันสามารถบำรุงรักษาส่วนบริการที่บางและ 'plug-in' เพื่อนำไปใช้งานกับบริการและกำจัดความต้องการให้โมดูลกังวลเกี่ยวกับ WCF เช่น
ในทางตรงกันข้ามมันอาจจะดีกว่าที่จะมีแต่ละโมดูลในตัวเองว่ามันมีอินเตอร์เฟซและการใช้งาน โฮสต์บริการอ้างถึงส่วนต่อสัญญาบริการที่พบในโมดูลและ IoC ได้รับการกำหนดค่าให้ใช้การใช้งานที่เหมาะสมจากโมดูลเช่นกัน ซึ่งหมายความว่าการเพิ่มโมดูลใหม่สามารถทำได้โดยไม่ต้องเปลี่ยนเลเยอร์บริการอื่นนอกเหนือจากการเพิ่มไฟล์. svc ใหม่และข้อมูลการกำหนดค่า IoC
ฉันกำลังคิดเกี่ยวกับผลกระทบถ้าฉันเปลี่ยนจาก WCF มาตรฐานเป็นส่วนติดต่อบริการ RESTful หรืออาจไปที่บริการ RIA หรืออะไรบางอย่าง หากแต่ละโมดูลมีการปฏิบัติตามสัญญาการบริการฉันต้องทำการเปลี่ยนแปลงในทุก ๆ โมดูลหากฉันเปลี่ยนเทคโนโลยีการบริการหรือวิธีการ แต่ถ้าซุ้มเป็นโมดูลของตัวเองแล้วฉันจะต้องสลับส่วนนั้นเพื่อทำการเปลี่ยนแปลง โมดูลนั้นจะต้องใช้ชุดสัญญาที่แตกต่างกัน (อินเทอร์เฟซ), อาจกำหนดไว้ในแอสเซมบลีที่ใช้ร่วมกัน ???
2. วิธีที่ดีที่สุดในการจัดการทรัพยากรการแชร์ระหว่างโมดูลและ / หรือการพึ่งพาระหว่างโมดูลคืออะไร?
ยกตัวอย่างเช่นการปฏิบัติการรับ ในตอนแรกบลัชออนมันสมเหตุสมผลแล้วที่จะเข้าสู่โมดูลสินค้าคงคลังเนื่องจากการรับสินค้าเป็นฟังก์ชั่นสินค้าคงคลัง อย่างไรก็ตามยังมีแง่มุมทางการเงินที่เราจำเป็นต้องสร้างใบเสร็จรับเงินและอนุมัติการชำระเงิน
ในอีกด้านหนึ่งฉันคาดว่าจะใช้กิจกรรม / การส่งข้อความบางส่วนของโดเมนเพื่อสื่อสารการดำเนินการ โมดูลสินค้าคงคลังยกระดับ GoodsReceivedEvent ซึ่งจัดการโดยโมดูลการเงินเพื่อสร้างการรับและเริ่มต้นกระบวนการชำระเงิน อย่างไรก็ตามนี่หมายความว่าโมดูลทางการเงินจำเป็นต้องรู้เกี่ยวกับรายการสินค้าคงคลังที่ได้รับ ฉันสามารถอ้างถึงพวกเขาด้วย ID แต่ถ้าฉันต้องการข้อมูลเพิ่มเติมสำหรับการรับเช่นชื่อและ / หรือคำอธิบายต้นทุนต่อหน่วยเป็นต้น มันสมเหตุสมผลหรือไม่ที่แต่ละโมดูลจะมีเวอร์ชันรายการสินค้าคงคลังที่ออกแบบมาเพื่อให้เหมาะกับความต้องการของโมดูลนั้น ๆ ในกรณีเช่นนั้นโมดูลการเงินจะต้องดำเนินการค้นหารายการสินค้าคงคลังของตัวเองเมื่อจัดการกับ GoodsReceivedEvent
...
ฉันใช้ตัวอย่างนี้โดยมีวัตถุประสงค์เพราะฉันทำงานมากกับระบบ ERP ที่หลากหลายและรู้ว่าพวกเขาได้รับการออกแบบด้วยโมดูลาร์ประเภทนี้ - ฉันไม่รู้ว่าจะทำอย่างไร ฉันยังไม่ได้กล่าวถึงอย่างชัดเจนข้างต้น แต่ฉันชอบที่จะทำตามหลักการออกแบบการขับเคลื่อนด้วยโดเมนในการสร้างโซลูชันและเชื่อว่าโมดูลาร์ประเภทนี้เหมาะกับพื้นที่นั้น
ความช่วยเหลือใด ๆ ที่ได้รับห่อหัวของฉันรอบนี้ชื่นชมอย่างมาก