Saturday, April 7, 2012

Provider Model ใน ASP.NET 2.0 ตอนที่ 1

ดัดแปลงจาก Provider Model ใน ASP.NET 2.0 ตอนที่ 1 ตีพิมพ์ในนิตยสาร Windows IT Pro ประจำเดือนเมษายน พ.ศ. 2549

ใน ASP.NET นั้นจะมีระบบย่อยต่างๆ เช่น Membership, Sitemap, Profile และระบบอื่นๆ รวมอยู่ภายในตัว .NET Framework ระบบเหล่านี้จะเรียกใช้ข้อมูลที่จัดเก็บเอาไว้ในแหล่งข้อมูล (Data Source) ที่หลากหลายรูปแบบทั้งระบบฐานข้อมูล, ไฟล์ข้อมูลแบบ XML, หรือแม้กระทั่งไฟล์ข้อมูลธรรมดา (Text File) การเรียกใช้ข้อมูลเหล่านี้จะทำการเรียกใช้ผ่าน Provider ทั้งหมด ซึ่งเป็นวิธีที่ไม่แปลกใหม่ แต่เพิ่มความสะดวกให้กับนักพัฒนาเป็นอย่างมาก
จุดเริ่มต้นของ Provider Model
ปกติแล้วเวลาที่เราทำการเขียนโค้ดสำหรับการดึงข้อมูลจากแหล่งข้อมูลนั้น เรามักจะเขียนโค้ดที่ดึงข้อมูลจากแหล่งเดียว ดังนั้นเวลาที่เราจะต้องเปลี่ยนแหล่งข้อมูลไปยังแหล่งอื่น เช่นการย้ายจากฐานข้อมูลของไมโครซอฟท์แอคเซสไปเป็น SQL Server หรือ MySql เราจะต้องทำการเขียนโค้ดในส่วนของการดึงข้อมูลใหม่ทั้งหมด และหากออกแบบไว้ไม่ดี การย้ายแหล่งข้อมูลอาจจะทำให้ต้องเขียนโค้ดสำหรับการแสดงผลใหม่เลยด้วยซ้ำ นอกจากนี้การเขียนโปรแกรมโดยการใช้ Provider Model ยังสามารถสร้างทางเลือกในการใช้งานเพื่อครอบคลุมสถานการณ์ที่หลากหลายได้อีก ด้วย ยกตัวอย่างเช่น ถ้าหากระบบ Membership, Sitemap และระบบอื่นๆใน ASP.NET 2.0 นั้นต้องใช้ SQL Server เท่านั้น คนที่ไม่ได้ใช้ SQL Server ซึ่งมีราคาสูง ก็จะเสียโอกาสและเสียเวลาเพื่อพัฒนาระบบเหล่านี้ขึ้นเองเป็นต้น
Provider Model คืออะไร แล้วช่วยอะไรได้บ้าง
จากปัญหาดังกล่าว จึงทำให้มีคนคิดค้น Provider Model ขึ้น โดยใน Provider Model นั้น ตัวโปรแกรมจะทำการดึงข้อมูลผ่านทาง Provider แล้วให้ Provider ไปดึงข้อมูลจากแหล่งข้อมูลที่กำหนดแทน หากเราเปลี่ยนตัว Provider ก็จะมีผลเฉพาะฝั่งของการติดต่อฐานข้อมูลเท่านั้น ทางฝั่งโปรแกรมก็ยังทำงานตามปกติโดยไม่รู้เลยว่ามีการเปลี่ยน Provider ไปแล้ว
ข้อดีอีกอย่างของการใช้ Provider Model ก็คือ เราสามารถนำข้อมูลที่มีอยู่แล้วมาใช้ได้ทันที ยกตัวอย่างเช่น เว็บไซต์ A เป็นเว็บไซต์ที่สร้างขึ้นด้วย ASP.NET 1.x มีสมาชิกจำนวนมาก และต้องการปรับเปลี่ยนระบบไปเป็น ASP.NET 2.0 โดยใช้ระบบ Membership และ Roles ที่มีมาพร้อมกับ ASP.NET 2.0 อยู่แล้ว ทางผู้พัฒนาก็ไม่จำเป็นที่จะต้องแปลงข้อมูลที่มีอยู่ให้เข้ากับ ระบบ Membership แต่เขียน Provider ขึ้นมาเพื่อติดต่อกับข้อมูลที่มีอยู่ก็สามารถเริ่มใช้งานได้ทันที
ใน ASP.NET 2.0 นั้นจะมีองค์ประกอบหลายส่วนที่พัฒนาโดยใช้ Provider Model ไม่ว่าจะเป็น Membership, Roles, Profile, หรือ SiteMap นอกจากนี้ยังมี Provider ที่ถูกสร้างขึ้นมาพร้อมใช้งานกับแหล่งข้อมูลบางตัวติดมาให้พร้อมกับ .NET Framework อยู่แล้วจำนวนหนึ่ง (แสดงไว้ในตารางที่ 1) จะเห็นได้ว่า Provider ส่วนใหญ่มักจะมีรูปแบบชื่อคือ DataSource + Feature + “Provider” จากตารางจะได้ข้อสังเกตอย่างหนึ่งว่าไม่มี Provider ใดที่ใช้งานได้กับไมโครซอฟท์แอคเซส เลย ถ้าเราต้องการใช้งาน Provider Model ตัวใดกับไมโครซอฟท์แอคเซสก็จะต้องเขียนเพิ่มขึ้นมา แล้วนำไปใช้ในโปรแกรมของเราด้วยการแก้ไขไฟล์ web.config เพียงแค่ไม่กี่บรรทัด
ประเภท
ชื่อ Type
Membership
System.Web.Security.ActiveDirectoryMembershipProvider
System.Web.Security.SqlMembershipProvider
Role management
System.Web.Security.AuthorizationStoreRoleProvider
System.Web.Security.SqlRoleProvider
System.Web.Security.WindowsTokenRoleProvider
Site map
System.Web.XmlSiteMapProvider
Profile
System.Web.Profile.SqlProfileProvider
Session state
System.Web.SessionState.InProcSessionStateStore
System.Web.SessionState.OutOfProcSessionStateStore
System.Web.SessionState.SqlSessionStateStore
Web events
System.Web.Management.EventLogWebEventProvider
System.Web.Management.SimpleMailWebEventProvider
System.Web.Management.TemplatedMailWebEventProvider
System.Web.Management.SqlWebEventProvider
System.Web.Management.TraceWebEventProvider
System.Web.Management.WmiWebEventProvider
Web Parts personalization
System.Web.UI.WebControls.WebParts.SqlPersonalizationProvider
Protected configuration
System.Configuration.DPAPIProtectedConfigurationProvider
System.Configuration.RSAProtectedConfigurationProvider
ตารางที่ 1: Provider ที่มีให้ใน ASP.NET 2.0 มีดังนี้ (สำหรับชื่อที่เป็นตัวหนาหมายถึง Default Provider)
การติดตั้งและปรับแต่ง Provider
Provider ทั้งหมดจะถูกกำหนดไว้ในแท็ก <providers> ของแต่ละส่วน ในไฟล์  web.config ยกตัวอย่างเช่น หากเราจะติดตั้ง Provider ให้กับส่วนของ Membership เราก็จะต้องตั้งค่าของแท็ก <providers> ไว้ในแท็ก <Membership> ดังนี้
<configuration>

  <system.web>     <membership …>
      <providers>
        <!– Membership providers registered here –>
      </providers>
     </membership>
   …
  </system.web>
</configuration>
ในส่วนของแท็ก <providers> เราจะต้องทำการเพิ่ม Provider ให้กับ ASP.NET Engine โดยใช้แท็ก <add> สมมติว่า เราจะเพิ่ม Provider ชื่อว่า MyMembership โดยใช้ชื่อ Type ว่า MyMembership.MyMembershipProvider เราจะต้องเพิ่มแท็ก <add> ไปดังนี้
<configuration>
  <system.web>
   <membership defaultProvider=”MyMembership”…>

     <providers>        <add name=”MyMembership”
              type=”MyMembership.MyMembershipProvider”
              description=”My new provider.”
              connectionStringName=”MyConnectionStringName”
       …
       >
    </membership>
  </system.web>
</configuration>
จุดที่ต้องสนใจก็คือ defaultProvider ที่ใช้สำหรับเลือก Provider ที่ต้องการในกรณีที่โปรแกรมไม่ได้ระบุว่าจะต้องใช้ Provider ตัวใดเป็นพิเศษ เนื่องจากเราสามารถเพิ่ม Provider ได้เรื่อยๆ แต่เราจะเลือกใช้ได้เพียง Provider เดียวในขณะใดขณะหนึ่งเท่านั้น
ทั้งนี้ Provider ของแต่ละระบบก็จะมีแอตตริบิวต์ต่างกันออกไป ขึ้นอยู่กับว่าจะเป็น Provider สำหรับใช้งานกับอะไร โดยเราสามารถดูวิธีการตั้งค่า และรายละเอียดต่างๆ ได้จาก เอกสารอ้างอิงของ ASP.NET ใน MSDN Library หรือคู่มือของ Provider แต่ละตัว
นอกจากนี้ ASP.NET ยังเตรียมตัวช่วยสำหรับการตั้งค่าและแก้ไขค่าคอนฟิกต่างๆผ่านทางหน้าเว็บโดย ใช้ชื่อว่า ASP.NET Web Site Administration Tool (WSAT) เครื่องมือนี้จะช่วยให้เราจัดการแก้ไขและตั้งค่าได้อย่างสะดวกทั้งในส่วนของ ระบบMembership, Roles และการเลือกใช้ Provider ต่างๆโดยเราไม่จำเป็นต้องแก้ไขไฟล์ web.config เลย
การเรียกใช้งาน Provider
ในการเรียกใช้งาน Provider นั้น ถ้าเป็นการเรียกใช้งานระบบที่ใช้ Provider ที่มากับ ASP.NET 2.0 ก็ เรียกใช้ผ่านทางคลาสที่ ASP.NET เตรียมเอาไว้ได้เลย แล้วตัว ASP.NET Engine จะไปเรียกใช้ Provider ตัวที่เรากำหนดเอาไว้ใน web.config ให้โดยอัตโนมัติ ในกรณีนี้ถ้าเราเรียกใช้ Membership.GetAllUsers() เพื่อทำการเรียกข้อมูลผู้ใช้งานระบบทั้งหมดที่มีอยู่ในแหล่งข้อมูลของ โปรแกรมของเรา ตัว ASP.NET Engine ก็จะทำการเรียก MyMembershipProvider.GetAllUsers() ให้เราเอง
การเขียน Provider ขึ้นใช้เอง
ในกรณีที่ Provider ที่ให้มาไม่สามารถทำงานตามที่เราต้องการหรือว่าใช้งานกับแหล่งข้อมูลของเรา ได้ เราอาจจะเขียน Provider ขึ้นมาใหม่เพื่อใช้กับแหล่งข้อมูลที่เราต้องการ ซึ่งมีหลักการคร่าว ๆ คือ Provider ทุกตัวจะเป็นคลาสที่สืบทอด (Inherit) มาจากคลาสที่เป็น ProviderBase โดยเราจะสืบทอดคลาสนี้เมื่อเราต้องการจะเขียน Base Provider หรือต้นแบบสำหรับ Provider ในแต่ละระบบ แต่ถ้าเราต้องการเขียน Provider สำหรับใช้งานกับระบบที่ใช้ Provider Model อยู่แล้ว ให้เลือกสืบทอดจากคลาสที่เป็นคลาสต้นแบบสำหรับ Provider ประเภทนั้นๆ ได้เลย ยกตัวอย่างเช่น หากเราต้องการเขียน Membership Provider สำหรับไมโครซอฟท์แอคเซส เราก็จะต้องสร้าง Provider ที่สืบทอดจากคลาส MembershipProvider เพราะว่าเป็น Provider สำหรับ Membership
รายละเอียดสำหรับการสร้าง Provider แต่ละนั้นตัวสามารถศึกษาได้จาก Class Reference ซึ่งแต่ละ Provider จะมีเมธอดต่างๆ ที่แตกต่างกันออกไป เราอาจจะเลือกเขียนเฉพาะบางเมธอดก็ได้ แต่สำหรับเมธอดที่เราไม่ได้เขียนขึ้นนั้นเราก็ยังจะต้อง override เมธอดนั้นเช่นกันแต่จะ override ด้วยการโยน NotSupportedException ออกมาแทน เพื่อให้ผู้ที่ใช้งาน Provider ของเราทราบว่าเมธอดนั้นๆ ยังไม่ได้ถูกเขียนขึ้นมา
สรุป
Provider Model นับเป็นหนึ่งในความสามารถใหม่ที่ดีที่สุดของ ASP.NET 2.0 เลยทีเดียว การใช้งาน Provider Model นั้นช่วยให้เราสามารถสร้างระบบการทำงานขึ้นมาโดยแยกกันระหว่างส่วนที่ติดต่อ แหล่งข้อมูล และส่วนอื่นๆ ของโปรแกรมได้อย่างอิสระ ทำให้การสร้างเว็บแอพพลิเคชันที่มีความสามารถพื้นฐานร่วมกันสามารถพัฒนาได้ อย่างรวดเร็ว และยืดหยุ่น ไม่ต้องคำนึงถึงที่มาของแหล่งข้อมูลอีกต่อไป สำหรับการเขียน Provider ขึ้นใช้เองนั้น จะมีรายละเอียดปลีกย่อยสำหรับแต่ละ Provider ซึ่งในบทความตอนต่อไปเราจะมาศึกษาการเขียน Provider กัน แล้วพบกันใหม่ครับ

ref : http://onedd.net/pages/provider-model-%E0%B9%83%E0%B8%99-asp-net-2-0/

No comments:

Post a Comment