ตกลง .. หลังจากการสนทนาทั้งหมดฉันเปลี่ยนคำถามเล็กน้อยเพื่อให้สะท้อนตัวอย่างที่เป็นรูปธรรมที่ฉันจัดการดีขึ้น
ฉันมีสองคลาสModelOne
และคลาสModelTwo
เหล่านี้มีฟังก์ชันการทำงานที่คล้ายกัน แต่ไม่เกี่ยวข้องกัน แต่ฉันมีชั้นที่สามCommonFunc
ที่มีบางฟังก์ชันการทำงานของประชาชนที่จะดำเนินการทั้งในModelOne
และและได้รับปัจจัยจากการเป็นต่อModelTwo
DRY
ทั้งสองรุ่นมีอินสแตนซ์ภายในModelMain
คลาส (ซึ่งเป็นอินสแตนซ์ในระดับที่สูงขึ้น ฯลฯ - แต่ฉันหยุดที่ระดับนี้)
ภาชนะ IoC ว่าฉันใช้เป็นไมโครซอฟท์สามัคคี ฉันไม่แกล้งทำเป็นผู้เชี่ยวชาญ แต่ฉันเข้าใจว่าคุณลงทะเบียน tuple ของ interface และ class กับ container และเมื่อคุณต้องการ class คอนกรีตคุณถาม IoC container สำหรับวัตถุใด ๆ ที่ตรงกับ interface เฉพาะ นี่ก็หมายความว่าสำหรับทุกวัตถุที่ฉันต้องการยกตัวอย่างจาก Unity จะต้องมีอินเตอร์เฟสที่ตรงกัน เพราะแต่ละชั้นเรียนของฉันดำเนินการที่แตกต่างกัน (และไม่ทับซ้อนกัน) ฟังก์ชั่นนี้หมายถึงว่ามีอัตราส่วน 1: ระหว่างอินเตอร์เฟซและชั้น 1 1 อย่างไรก็ตามมันไม่ได้หมายความว่าฉันกำลังเขียนอินเทอร์เฟซสำหรับแต่ละคลาสที่ฉันเขียน
ดังนั้นรหัสฉลาดฉันท้ายด้วย2 :
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
คำถามคือเกี่ยวกับวิธีจัดระเบียบโซลูชันของฉัน ฉันควรรักษาคลาสและอินเทอร์เฟซไว้ด้วยกันหรือไม่ หรือฉันควรรักษาคลาสและอินเทอร์เฟซไว้ด้วยกัน? เช่น:
ตัวเลือก 1 - จัดโดยชื่อคลาส
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
ตัวเลือก 2 - จัดระเบียบตามหน้าที่การใช้งาน (ส่วนใหญ่)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
ตัวเลือก 3 - การแยกส่วนต่อประสานและการนำไปใช้
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
ตัวเลือก 4 - ยกตัวอย่างการใช้งานเพิ่มเติม
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
ฉันไม่ชอบตัวเลือกที่ 1 เนื่องจากชื่อคลาสในพา ธ แต่ที่ผมกำลังพุ่งไปอัตราส่วน 1: 1 เพราะ IoC / ทางเลือกการใช้งานของฉัน (และที่อาจจะเป็นที่ถกเถียงกัน) นี้มีข้อได้เปรียบในการมองเห็นความสัมพันธ์ระหว่างไฟล์
ตัวเลือกที่ 2 น่าสนใจสำหรับฉัน แต่ตอนนี้ฉันมีโคลนระหว่างน้ำกับModelMain
รุ่นย่อย
ตัวเลือกที่ 3 ทำงานเพื่อแยกคำจำกัดความอินเทอร์เฟซจากการใช้งาน แต่ตอนนี้ฉันมีตัวแบ่งเทียมเหล่านี้ในชื่อพา ธ
ตัวเลือก 4 ฉันเอาตัวเลือก 2 และ tweaked มันเพื่อแยกส่วนประกอบจากรูปแบบหลัก
มีเหตุผลที่ดีในการเลือกหนึ่งอันใดอันหนึ่งหรือไม่? หรือรูปแบบที่เป็นไปได้อื่น ๆ ที่ฉันพลาดไป?
1. แฟรงค์แสดงความคิดเห็นว่าการมีอัตราส่วน 1: 1 ทำให้กลับมาที่ C ++ วันของไฟล์. h และ. cpp ฉันรู้ว่าเขามาจากไหน ความเข้าใจในความสามัคคีของฉันดูเหมือนจะทำให้ฉันเข้ามุมนี้ แต่ฉันก็ไม่แน่ใจด้วยซ้ำว่าจะทำยังไงถ้าคุณทำตามสุภาษิตของProgram to an interface
แต่นั่นเป็นการอภิปรายอีกวันหนึ่ง
2. ฉันได้ละรายละเอียดของตัวสร้างออบเจ็กต์แต่ละรายการ นี่คือที่ที่คอนเทนเนอร์ IoC ฉีดวัตถุตามต้องการ
Client1
ต้องการจะให้IBase
Derived1
เมื่อClient2
ความต้องการIBase
ที่ IoC Derived2
ให้
interface
มัน An interface
เป็นเพียงคลาสนามธรรมกับสมาชิกเสมือนทั้งหมด