วันนี้ไม่รู้จะเขียนอะไร ก็เลยมาเขียนเกี่ยวกับ POCO ซะหน่อยดีกว่า ว่ามันมีที่มาที่ไปยังไง
จริงๆ POCO ก็ไม่มีอะไรมากมาย แต่เพราะชื่อมันนี่เองที่ทำให้เรา งง กับมัน มาเริ่มกันเลยครับ...
ประเด็นมันเริ่มต้นเมื่อเราต้องการจะออกแบบ Architecture ของโปรแกรมเรา
ให้แยกออกเป็น Layer ต่างๆ ตามที่คุ้นเคยก็คงหนีไม่พ้น 3-Layer
Presentation เรียกใช้ Business และ Business เรียกใช้ Data Access แบบนี้
Focus to Business Logic Layer
ปกติหากเราออกแบบในส่วนของ Business เราสามารถทำได้เป็น 3 แบบ (Domain Logic Patern ) ดังนี้
1. Transaction Scripts
2. Domain Model
3. Table Module
***ref : Pattern of Enterprise Appication Architecture (PoEAA)
**ซึ่งผมไม่ขอพูดเกี่ยวกับรายละเอียดของแต่ละตัวใน Blog นี้ครับ ไว้ค่อยคุยกันนอกรอบ...
เรามาดูที่ Domian Model ซึ่งหากเราออกแบบ Class เพื่อมาใช้กับระบบหนึ่งๆ สมมุติ ระบบการสั่งซื้อสินค้า
เราก็อาจจะ Design Class ได้ประมาณด้านนี้
Domain Model
นั่นคือ Class ของเราก็จะเป็นเหมือนตัวแทนบอกเล่าเรื่องราวของระบบนั้นๆ
แล้ว POCO มันเป็นยังไง มาดูกันตามด้านล่างนี้ครับ..
เราสามารถสร้าง Class Order ได้โดยการเขียนขึ้นมาเอง หรือไม่ก็ใช้ EF/LINQtoSQL ในการทำ Domain Class
ก็ได้แบบนี้
POCO (เขียนเอง)
public class Order : EntityBase<Order ,int>{
public DateTime OrderDate {get;set;}
public Customer OrderedBy {get;set;}
....
}
No POCO (ใช้ EF(VS 2008 ) ช่วย Gen จาก DataBase )
[global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Orders")]
[global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]
[global::System.Serializable()]
public partial class Orders : global::System.Data.Objects.DataClasses.EntityObject
{
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[global::System.Runtime.Serialization.DataMemberAttribute()]
public int OrderID{
get { return this._OrderID; }
set {
this.OnOrderIDChanging(value);
this.ReportPropertyChanging("OrderID");
this._OrderID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
this.ReportPropertyChanged("OrderID");
this.OnOrderIDChanged();
}
}
private int _OrderID;
partial void OnOrderIDChanging(int value);
partial void OnOrderIDChanged();
}
จากข้างบน เรามาหาคำจำกัดความของ POCO กันดีกว่า
" POCO ก็คือ การที่ Class ธรรมดาๆ ที่ใช้ในการอธิบายเกี่ยวกับระบบที่เราพัฒนา
โดยไม่ไปผูกติดกับวิธีการ Persistence Data นั่นเอง "
ซึ่งส่วนตัวผมชอบ POCO นะ ^^
แล้วมันดียังไง ?
- ทำให้เราสามารถเปลี่ยนวิธีการ Implement ในส่งของ Persistence โดยจะกระทบกับตัว Domain Class น้อย
- ทำให้ Code ดูไม่ยุ่งเหยิง ปรับแต่งเพิ่มเติมก็ทำได้ง่ายขึ้น เทสง่ายขึ้น
สำหรับชื่อ POCO นั้นอย่างที่บอกไปในตอนต้นว่า ชื่อมันไม่ค่อยจะสื่อสักเท่าไหร่ เนื่องจากว่า