แนวปฏิบัติที่ดีเกี่ยวกับ Visual Studio Solutions [ปิด]


10

หวังว่าคำถามง่ายๆสัมพัทธภาพ ฉันเริ่มทำงานในโครงการภายในใหม่เพื่อสร้างความสามารถในการรองรับอุปกรณ์ที่ได้รับการซ่อมแซมภายในอาคารได้

ฐานข้อมูลจะถูกจัดเก็บจากระยะไกลบนเว็บเซิร์ฟเวอร์และจะสามารถเข้าถึงได้ผ่านทางเว็บ API (JSON เอาต์พุต) และได้รับการปกป้องด้วย OAuth GUI ปลายด้านหน้ากำลังดำเนินการใน WPF และรหัสธุรกิจใน C #

จากนี้ฉันเห็นเลเยอร์ที่แตกต่างกันการนำเสนอ / แอพลิเคชัน / Datastore จะมีรหัสสำหรับจัดการการโทรที่ผ่านการรับรองความถูกต้องทั้งหมดไปยัง API, คลาสเพื่อเป็นตัวแทน (วัตถุธุรกิจ), คลาสเพื่อสร้างเอนทิตี (วัตถุธุรกิจ), ชิ้นส่วนสำหรับ WPF GUI, ชิ้นส่วนของ WPF viewmodels เป็นต้น

เป็นการดีที่สุดที่จะสร้างสิ่งนี้ในโครงการเดียวหรือแยกพวกมันออกเป็นแต่ละโครงการ?

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


1
ฉันจะแยกพวกเขาออกเป็นสิ่งที่สมเหตุสมผลสำหรับโครงการ
Ramhound

ใครบ้างมีความคิดใด ๆ หนึ่งในโครงการสำหรับการถืออินเทอร์เฟซตามที่ MattDavey แนะนำ ฉันใช้วิธีนี้ก่อนเพื่อหลีกเลี่ยงการอ้างอิงที่กล่าวถึง หรืออินเทอร์เฟซสำหรับคลาส x ควรนั่งในโครงการเดียวกันกับคลาส x
JonWillis

นอกจากนี้คุณใช้เลเยอร์อะไรบ้าง ฉันเห็นความแตกต่างไม่กี่อย่าง แต่สิ่งที่สำคัญคือการนำเสนอ / แอปพลิเคชัน / โครงสร้างพื้นฐาน บางแอปพลิเคชันยังแบ่งเป็น 2 ส่วนแอปพลิเคชัน + บริการ บางรุ่นยังพูดถึงเลเยอร์เฉพาะสำหรับตรรกะทางธุรกิจซึ่งสำหรับฉันอาจรวมอยู่ในวัตถุทางธุรกิจด้วยตนเอง
JonWillis

คำตอบ:


8

ขึ้นอยู่กับขนาดของโครงการ

นี่คือแนวทางที่ฉันมักจะใช้

  • โครงการขนาดเล็กที่มีหน้าไม่กี่หน้าหรือน้อยกว่าฉันมักจะทำโครงการเดียวเสมอ

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

  • หากโครงการมีขนาดใหญ่กว่าฉันจะมีโครงการแยกต่างหากสำหรับ DAL และการแยกเพิ่มเติมขึ้นอยู่กับขอบเขตของการทำงานของแอปพลิเคชัน

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

  • ถ้าผมมีหลายโครงการที่ต้องอ้างอิงชุดเดียวกันของวัตถุ ( ViewModelBase, RelayCommandฯลฯ ) ฉันจะสร้างโครงการเพียงสำหรับวัตถุโครงสร้างพื้นฐานที่ใช้ร่วมกัน

  • หากฉันมีสไตล์ / เทมเพลต / ทรัพยากรที่กำหนดเองที่แชร์กันเป็นจำนวนมากฉันจะสร้างโครงการสำหรับเหล่านั้นโดยเฉพาะ

ในฐานะที่เป็นบันทึกด้านข้างฉันทำผิดพลาดกับโครงการ WPF ขนาดใหญ่ครั้งแรกของฉันและแยกพวกเขาโดยการวางนางแบบในโครงการหนึ่ง, ดูในอีกโครงการและ ViewModels ในหนึ่งในสาม ฉันสามารถบอกคุณได้ว่าตอนนี้ไม่ใช่วิธีที่จะไปเนื่องจากการบำรุงรักษากลายเป็นฝันร้าย :)


อยากรู้ว่าคุณมีปัญหาการบำรุงรักษาอะไรโดยการแยกเลเยอร์
เอียน

@Rachel ฉันจะใช้ WPF ดังนั้นจะสนใจที่จะทราบว่าคุณจัดโครงการในตอนท้าย ฉันคิดว่าฉันสามารถจำโครงการ MVC ขนาดเล็กได้รับความเจ็บปวดเมื่อแยก 3 ส่วนออกเป็น 3 Dll สำหรับ WPF มุมมองของฉันจะเป็น GUI วัตถุนิติบุคคล / ธุรกิจที่จะเปลี่ยนและ ViewModel ปฏิสัมพันธ์ระหว่างพวกเขา ViewModel จะจัดการกับตรรกะของการเรียกที่เก็บเพื่อโหลด / บันทึกการซ่อมแซม (ซึ่งจะมีโรงงาน / เว็บ API ฯลฯ )
JonWillis

1
@Ian ปัญหาที่ใหญ่ที่สุดคือการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ส่วนใหญ่เช่นการเพิ่มฟิลด์เดียวทำให้ฉันต้องตามหา Model, View, ViewModel และ DAL ใน 4 ไลบรารีแยกกัน โครงการที่ฉันทำงานในเวลานั้นค่อนข้างใหญ่และฉันเสียเวลามากกว่าที่ฉันต้องการหาไฟล์ที่เฉพาะเจาะจง ตั้งแต่นั้นมาผมได้เปลี่ยนการทำให้วัตถุที่เกี่ยวข้องร่วมกันเพื่อให้ตัวอย่างเช่นอะไรที่เกี่ยวข้องกับการค้นหาเช่นSearchView, SearchViewModelและSearchResultModelทั้งหมดจะได้รับการรวมกลุ่มกันในโฟลเดอร์และฉันได้พบมันทำให้แอปง่ายต่อการรักษา
Rachel

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

1
@JonWillis โครงการ WPF ส่วนใหญ่ของฉันแตกออกจากจุดที่ระบุในคำตอบของฉัน โดยปกติ DAL จะเป็นเลเยอร์ของตนเองและแต่ละโมดูลหรือส่วนของโครงการจะถูกจัดกลุ่มเข้าด้วยกัน (ไม่ว่าจะเป็นโฟลเดอร์เนมสเปซหรือโครงการขึ้นอยู่กับขนาดของโครงการ) ตัวอย่างเช่นวัตถุการค้นหาทั้งหมดจะอยู่ด้วยกันรวมถึงการInterfaceสำหรับชั้นข้อมูล แต่ชั้นการเข้าถึงข้อมูลที่แท้จริงสำหรับการค้นหาจะอยู่ในห้องสมุด DAL บ่อยครั้งที่ฉันมีห้องสมุดInfrastructureหรือCommonที่มีคลาสพื้นฐานทั่วไป, อินเตอร์เฟซและชั้นเรียนผู้ช่วย
Rachel

14

ฉันเห็นผลลัพธ์ที่ดีที่สุดด้วยหนึ่งโครงการต่อชั้นรวมทั้งโครงการทดสอบต่อชั้น ฉันได้เห็นการใช้งานไม่กี่คนที่ไม่สามารถทำได้ใน 10 หรือน้อยกว่าโครงการในการแก้ปัญหาที่แก้ปัญหาที่ครอบคลุมทุกอย่าง

อย่าตกหลุมพรางในการใช้โปรเจคที่คุณต้องการกำหนดเนมสเปซ ตันของโครงการไม่เพิ่มอะไรนอกจากค่าใช้จ่ายเพื่อผลประโยชน์


9

แยก IMHO นั้นดีกว่าเกือบทุกครั้ง ฉันมักจะแยกชั้นข้อมูลออกนอกเสียจากว่าโครงการนั้นจะมีความสำคัญ 100% เหตุผลก็คือเพราะชั้นข้อมูลมักจะถูกส่งผ่านบ่อยที่สุด คุณจะเชื่อมโยง GUI กับชั้นข้อมูลหลาย ๆ ครั้งและคาดว่ามันจะทำงานได้ดี สถานการณ์ทั่วไปที่พบได้บ่อยคือคุณมีชั้นข้อมูลเดียวและคุณต้องการให้กระจายออกไปในหลาย ๆ GUI (ASP.Net, WPF และแอป Silverlight เป็นต้น) มันยอดเยี่ยมเมื่อคุณสามารถสร้างโครงการเลเยอร์ข้อมูลและวาง dll นั้นไว้เป็นข้อมูลอ้างอิงใน GUI ถัดไปที่คุณสร้าง


+1 เมื่อฉันเริ่มโครงการใหม่ฉันมักจะสร้างชั้นข้อมูลจำลองซึ่งเก็บข้อมูลไว้ในหน่วยความจำ ทำให้ฉันสามารถสร้างแอพที่เหลือก่อนได้ จากนั้นฉันสามารถสลับออกเป็นเลเยอร์การเข้าถึงข้อมูล "ของจริง" ในภายหลัง ..
MattDavey

คุณจะพิจารณาเอนทิตี (DTO), โรงงานและคลาสที่ใช้ในการสื่อสารกับเว็บเซิร์ฟเวอร์ทุกส่วนของชั้นข้อมูลหรือไม่
JonWillis

@JonWillis - ไม่อาจไม่ใช่ทั้งหมด ฉันจะวางโรงงานและคลาสสำหรับเว็บเซิร์ฟเวอร์ในเนมสเปซของโครงการห้องสมุดคลาส ชั้นข้อมูลทั่วไปของฉันไม่มีอะไรนอกจากไฟล์ dbml และ / หรือไฟล์ edmx ที่จำเป็น ตามกฎแล้วฉันจะให้ "ไลบรารี่ / กรอบงาน" ของโครงการของพวกเขาเอง แน่นอนว่าพวกเขาไม่จำเป็นต้องถูกโยนลงในโครงการ GUI แม้ว่าฉันจะเห็นคนทำเช่นนั้นตลอดเวลา
Morgan Herlocker

แม้ว่าในความเป็นจริงจะใช้เวลานานแค่ไหนที่คุณจะใช้เนมสเปซ 2-3 อันและแยกมันออกเป็นโครงการใหม่ ฉันรู้สึกว่ามันเป็นงานการเปลี่ยนโครงสร้างใหม่ที่ค่อนข้างง่าย
Didier A.

4

สำหรับฉัน 4 * เป็นหมายเลขเวทย์มนตร์ โครงการหนึ่งสำหรับแต่ละชั้นและโครงการหนึ่งซึ่งกำหนดอินเทอร์เฟซ / DTO ทั้งหมดที่จำเป็นในการสื่อสารระหว่างพวกเขา

* 7 ถ้าคุณนับการทดสอบหน่วย


2

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


2

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


เลเยอร์ใดที่คุณแยกออกไป คุณมีชั้น Application / Services แยกกันหรือไม่และถ้าเป็นเช่นนั้นจริงแล้วมันมีความแตกต่างกันอย่างไร ตรรกะทางธุรกิจของคุณมีอยู่ภายในแอปพลิเคชัน / บริการหรือเป็นวิธีการในวัตถุธุรกิจจริงหรือไม่?
JonWillis

1

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

มันทำงานได้ดีเมื่อฉันกำลังทำอะไรบางอย่างของการผกผันของการพึ่งพาอาศัยเพื่อวาง "สัญญา", อินเทอร์เฟซ, คลาสนามธรรม, วัตถุการถ่ายโอนข้อมูลลงในการประกอบ ในการชุมนุมอื่นฉันใส่อะไรที่พูดถึงฐานข้อมูล การทดสอบหน่วยจะได้รับการประกอบของตัวเอง หาก UI นั้นไม่สามารถทดสอบได้พื้นฐาน (เช่น winforms ของ ASP.NET) แสดงว่ามีประโยชน์อย่างมากในการแบ่ง UI ออกเป็นรหัสที่ทดสอบได้และรหัสที่ไม่สามารถทดสอบได้ - การประกอบแต่ละตัว บางครั้งรหัสบางอย่างเริ่มปรากฏขึ้นซึ่งไม่เกี่ยวข้องกับฐานข้อมูล UI หรือสิ่งใดก็ตามที่ฉันได้กล่าวมาจนถึงตอนนี้ - มันเป็นรหัสที่ฉันต้องการอยู่ในกรอบงาน. NET รหัสนั้นฉันจะใส่ลงในชุดประกอบยูทิลิตี้หรืออย่างน้อยก็ใส่ไว้ในสิ่งที่ประกอบรูทเป็น (อาจเป็นหนึ่งที่มีอินเตอร์เฟซ

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

Visual Studio บางรุ่นพบปัญหาประสิทธิภาพการทำงานที่แอสเซมบลีประมาณ 15 บางครั้งก็ขึ้นอยู่กับชนิดของโครงการ บางครั้งการยกเลิกการโหลดไฟล์โครงการสามารถช่วยได้


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

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

-2

เหตุผลที่ดีเพียงข้อเดียวที่มีมากกว่าหนึ่งโครงการคือถ้าคุณต้องการแชร์ชุดของคลาสและไฟล์ในหลาย ๆ แอปพลิเคชัน

หากมีการใช้งานโปรเจ็กต์เพียงแอปพลิเคชั่นเดียวก็ไม่ควรสร้างขึ้นมาตั้งแต่แรก ใช้เนมสเปซแทน ช่วยตัวเองให้พ้นปัญหาของการอ้างอิงแบบวงกลมค่าใช้จ่ายของ dll และความสับสนของโครงการเมื่อค้นหาไฟล์

อ่านบทความนี้เพื่ออธิบายคำอธิบายเชิงลึกว่าทำไมจึงเป็นเช่นนั้น: http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- วิธีการแก้ปัญหาของไฟล์ /

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


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