วิธีจัดโครงสร้างโซลูชัน / โครงการที่ทับซ้อนกันหลายรายการใน. Net


16

ฉันเพิ่งเริ่มทำงานกับลูกค้าใหม่ที่มีมรดกเก่า codebaseซึ่งมีโซลูชัน. net หลายรายการโดยทั่วไปแต่ละโฮสต์โฮสต์บางโครงการที่ไม่ซ้ำกันกับโซลูชันนั้น แต่แล้วลิงก์ "ยืม" / "ใน" (เพิ่มโครงการที่มีอยู่) บางโครงการอื่น ๆ ซึ่งทางเทคนิคเป็นของโซลูชั่นอื่น ๆ (อย่างน้อยถ้าคุณไปตามโครงสร้างโฟลเดอร์ใน TFS)

ฉันไม่เคยเห็นการตั้งค่านี้พันกันไม่มีคำสั่งสร้างที่ชัดเจนบางครั้งโครงการในการแก้ปัญหาการอ้างอิงที่กำลังโดยตรงจากไดเรกทอรีผลลัพธ์ของโครงการที่โฮสต์ในโซลูชัน B บางครั้งโครงการได้รวมโดยตรงแม้ว่ามันจะอยู่ ไกลออกไปในโครงสร้างโฟลเดอร์

ดูเหมือนว่าทุกอย่างได้รับการปรับปรุงเพื่อความเกียจคร้านของนักพัฒนาซอฟต์แวร์

เมื่อฉันเผชิญหน้ากับพวกเขาว่าทำไมพวกเขาถึงไม่มีเซิร์ฟเวอร์ CI พวกเขาตอบว่ามันยากที่จะตั้งค่าด้วยรหัสที่จัดระเบียบแบบนี้ (ฉันกำลังตั้งค่าตอนนี้และสาปแช่งรหัสองค์กร)

การแก้ปัญหาถูกจัดระเบียบรอบ ๆ สิ่งประดิษฐ์การปรับใช้ (สิ่งที่ต้องมีการปรับใช้ร่วมกันอยู่ในโซลูชันเดียวกัน) ซึ่งฉันคิดว่าเป็นการตัดสินใจที่ชาญฉลาด แต่เนื้อหาของการแก้ปัญหาเหล่านั้น (โครงการ) อยู่ทั่วสถานที่

มีมติของวิธีปฏิบัติที่ดีที่สุดที่จะใช้เมื่อนำไลบรารีคลาสทั่วไปกลับมาใช้ซ้ำในหลายโซลูชัน / การปรับใช้ส่วน

  • วิธีการโครงสร้างรหัสใน VCS
  • วิธีอำนวยความสะดวกในการแบ่งปันตรรกะทางธุรกิจระหว่างส่วนการปรับใช้แยกต่างหาก

คำตอบ:


9

ฉันไม่เคยเป็นแฟนของการรวมโครงการที่มีอยู่ที่เป็นของโซลูชันอื่น ๆ มีตัวแปรจำนวนมากเกินไปที่ทำให้การแก้ไขโครงการนั้นสำหรับโซลูชัน 1 รายการแตกบางอย่างในโซลูชันอื่นอย่างสมบูรณ์ จากนั้นด้วยการแก้ไขปัญหานั้นคุณจะต้องหยุดการแก้ไขปัญหาเดิม นวดแล้วล้างซ้ำ

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


3
นอกจากนี้ refactoring จึงเป็นเรื่องง่ายวันนี้ดังนั้นหากคุณทำรู้สึกว่าบางเดือยของช่วงเวลาการเปลี่ยนแปลงก็เพียงพอที่สำคัญที่จะทำให้อยู่ในห้องสมุดของตัวเองคุณสามารถทำให้โครงการใบสมัครของคุณในขณะนี้และรวมมันเข้าไปในห้องสมุดในภายหลังเมื่อคุณมีสมาธิกับงานปัจจุบันของคุณน้อยและมีเวลาทำการทดสอบที่เหมาะสม
Aaronaught

@Aaraught: +1 ถึงสิ่งนั้น
Joel Etherton

5

ฉันได้จัดโครงสร้าง TFS เช่นเดียวกับที่คุณพูดถึงและในขณะที่มันนำเสนอความท้าทายที่ไม่ซ้ำกับ CI แต่ก็มีประโยชน์ที่แตกต่างกัน หนึ่งที่ชัดเจนคือมันสนับสนุนและส่งเสริมให้มีการแบ่งองค์ประกอบที่เหมาะสมในโครงการ. NET แยกต่างหากและดังนั้นจึงสนับสนุน TDD ที่ดีโดยส่งเสริมการทดสอบครอบคลุม 100% ทันทีที่ค้างคาวฉันสังเกตเห็นปัญหาเล็กน้อยที่คุณสามารถจัดการได้

บางครั้งโครงการในการแก้ปัญหาการอ้างอิงที่กำลังโดยตรงโดยตรงจากไดเรกทอรีผลลัพธ์ของโครงการที่โฮสต์ในการแก้ปัญหา B บางครั้งโครงการได้รับการรวมโดยตรงแม้ว่าจะอยู่ไกลออกไปในโครงสร้างโฟลเดอร์

การอ้างอิงแบบไบนารีกับผลลัพธ์ของไดเรกทอรีอื่น ๆ ไม่ใช่วิธีการที่ดีและกลายเป็นวิธีการที่ไม่ถูกต้องเมื่อผสานกับการอ้างอิงโครงการเช่นกัน พยายามที่จะทำอย่างใดอย่างหนึ่งเปลี่ยนการอ้างอิงไบนารีของคุณให้เป็นโครงการอ้างอิงเพื่อความสอดคล้องอย่างน้อยที่สุด ณ จุดนี้โซลูชันแต่ละรายการสามารถแสดงแอปพลิเคชันที่สร้างได้หรือแอปพลิเคชันระดับเดียว (เช่น SuperApp.sln, OtherAppServices.sln, OtherAppPresentationTier.sln)

ในการสร้างโครงการทั้งหมดฉันขอแนะนำให้สร้างโซลูชันหลักเช่นกัน โซลูชันหลักจะมีการอ้างอิงโครงการกับทุกสิ่งและมีอยู่เป็นหลักเพื่อผลประโยชน์เพียงอย่างเดียวของการมีคำสั่งการสร้างเดียวที่จัดการโครงการทั้งหมดในชุดแอพพลิเคชัน นักพัฒนาไม่ควรใช้ Master Solution ในการพัฒนาหรือแก้ไขข้อบกพร่อง สิ่งนี้ทำให้การประกอบสิ่งประดิษฐ์สร้างง่ายขึ้นมาก

การปรับใช้สามารถทำได้ด้วยแบตช์แบบง่าย, PowerShell หรือสคริปต์ Perl สิ่งนี้จะสร้างโซลูชันที่เหมาะสมหรือโซลูชันหลักแล้วปรับใช้ทุกอย่างให้เหมาะสมกับสภาพแวดล้อมที่เหมาะสม สิ่งนี้สามารถรวมเข้ากับเซิร์ฟเวอร์ CI ใดก็ได้หากทำได้ถูกต้อง

•วิธีการอำนวยความสะดวกในการแบ่งปันตรรกะทางธุรกิจระหว่างส่วนการปรับใช้แยกต่างหาก

สร้างโครงการสำหรับตรรกะทางธุรกิจทั่วไปหรือมีการแยกความกังวลที่ดีขึ้นสำหรับตรรกะทางธุรกิจทั่วโลกหรือสากลมากขึ้น โซลูชันที่ปรับใช้ได้ทั้งหมดที่ต้องการอ้างอิงสิ่งนี้ควรทำได้โดยการอ้างอิงโครงการ

ในการจัดระเบียบรหัสของคุณใน TFS มันจะง่ายขึ้นในการบรรลุเป้าหมายนี้โดยการทำให้โครงการทั่วไปหรือที่ใช้ร่วมกันอยู่ในระดับที่สูงขึ้นในแผนผังไดเรกทอรี

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