ฉันมีเว็บแอพพลิเคชั่น ฉันไม่เชื่อว่าเทคโนโลยีเป็นสิ่งสำคัญ โครงสร้างเป็นแอปพลิเคชันระดับ N ซึ่งแสดงในภาพทางด้านซ้าย มี 3 ชั้น
UI (รูปแบบ MVC), Business Logic Layer (BLL) และ Data Access Layer (DAL)
ปัญหาที่ฉันมีคือ BLL ของฉันมีขนาดใหญ่มากเนื่องจากมีตรรกะและเส้นทางผ่านการเรียกแอปพลิเคชันกิจกรรม
โฟลว์ทั่วไปผ่านแอ็พพลิเคชันอาจเป็น:
มีเหตุการณ์เกิดขึ้นใน UI ข้ามไปที่เมธอดใน BLL ดำเนินการกับลอจิก (อาจอยู่ในหลายส่วนของ BLL) ในที่สุดถึง DAL กลับไปที่ BLL (ซึ่งเป็นไปได้ว่ามีตรรกะมากกว่า) จากนั้นส่งคืนค่าบางค่าไปยัง UI
BLL ในตัวอย่างนี้ยุ่งมากและฉันคิดว่าจะแยกออก ฉันมีตรรกะและวัตถุที่รวมกันซึ่งฉันไม่ชอบ
เวอร์ชั่นด้านขวาคือความพยายามของฉัน
เหตุผลยังคงเป็นวิธีการประยุกต์ไหลระหว่าง UI และ DAL แต่มีแนวโน้มที่คุณสมบัติไม่ ... เพียงวิธีการ (ส่วนใหญ่ของการเรียนในชั้นนี้อาจเป็นไปได้ที่จะเป็นแบบคงที่ที่พวกเขาไม่จัดเก็บใด ๆ ของรัฐ) เลเยอร์ Poco เป็นที่มีคลาสซึ่งมีคุณสมบัติ (เช่นคลาส Person ซึ่งจะมีชื่ออายุความสูงและอื่น ๆ ) สิ่งเหล่านี้จะไม่เกี่ยวกับการไหลของแอปพลิเคชันพวกเขาเก็บสถานะเท่านั้น
การไหลอาจเป็น:
แม้จะถูกกระตุ้นจาก UI และส่งผ่านข้อมูลบางอย่างไปยังตัวควบคุมเลเยอร์ UI (MVC) นี่แปลข้อมูลดิบและแปลงเป็นโมเดล poco จากนั้นโมเดล poco จะถูกส่งผ่านไปยังเลเยอร์ลอจิก (ซึ่งก็คือ BLL) และในที่สุดก็ไปที่เลเยอร์ข้อความค้นหาคำสั่ง ชั้นแบบสอบถามคำสั่งแปลง POCO เป็นวัตถุฐานข้อมูล (ซึ่งเกือบจะเหมือนกัน แต่หนึ่งถูกออกแบบมาสำหรับการติดตาอีกคนสำหรับปลายด้านหน้า) รายการถูกเก็บไว้และวัตถุฐานข้อมูลจะถูกส่งกลับไปยังเลเยอร์คำสั่ง จากนั้นจะถูกแปลงเป็น POCO ซึ่งจะกลับไปที่เลเยอร์ลอจิกซึ่งอาจประมวลผลต่อไปและในที่สุดก็กลับไปที่ UI
ตรรกะและอินเตอร์เฟสที่ใช้ร่วมกันเป็นที่ที่เราอาจมีข้อมูลถาวรเช่น MaxNumberOf_X และ TotalAllowed_X และอินเทอร์เฟซทั้งหมด
ทั้งตรรกะ / อินเตอร์เฟสที่แบ่งใช้และ DAL เป็น "ฐาน" ของสถาปัตยกรรม สิ่งเหล่านี้ไม่รู้อะไรเลยเกี่ยวกับโลกภายนอก
ทุกอย่างรู้เกี่ยวกับ poco นอกเหนือจากตรรกะ / อินเตอร์เฟสและ DAL ที่ใช้ร่วมกัน
การไหลยังคงคล้ายกับตัวอย่างแรก แต่ทำให้แต่ละเลเยอร์รับผิดชอบมากกว่า 1 อย่าง (ไม่ว่าจะเป็นสถานะการไหลหรือสิ่งอื่นใด) ... แต่ฉันจะทำลาย OOP ด้วยวิธีการนี้หรือไม่?
ตัวอย่างการสาธิตลอจิกและ Poco อาจเป็น:
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}