บทความชุด .NET 6 แบบจับมือทำ — #10: Infra Project & Entity Framework

Ponggun
T. T. Software Solution
4 min readFeb 18, 2023

Infra Project

ติดตั้ง EF Core Nuget Package สำหรับ PostgreSQL

  • พิมพ์ Ctrl + Shift + P
  • พิมพ์ nuget
  • พิมพ์ Npgsql.EntityFrameworkCore.PostgreSQL
  • เลือกติดตั้งลงไปยัง Infra Project
กด Install ได้เลยครับ ถ้าเลือก Nuget ชื่อ Npgsql.EntityFrameworkCore.PostgreSQL แล้ว
เมื่อเพิ่ม Package แล้วเราจะเห็นการเปลี่ยนแปลงใน .csproj นะครับ

สร้าง Entity Framework Database Context

  • สร้าง Folder ชื่อ Database
  • สร้าง Database Context ใน Folder โดยทำตามวิธีที่กำลังจะกล่าวถึงในขั้นตอนถัดไป หรือ ใช้วิธี Copy Code ข้างล่างนี้ก็ได้นะครับ

เผื่อใครต้องการตัวช่วยก็ Download Database Context ได้จากลิ้งนี้เลย

  • ทำการสืบทอด Class DbContext ของ Entity Framework
  • สร้าง Constructor ของ Database Context
กด CTRL + . เพื่อช่วยสร้าง Constructor
  • ระบุ DbSet โดยอ้างอิงจาก Domain Project เพื่อใช้ในการสร้างเป็น Database Tables
  • สร้าง Folder Configurations และสร้าง Database Configuration Files สำหรับทั้ง Province และ PointOfInterest เพื่อกำหนด Schema ของ Table ว่ามี Field ไหนเป็น Primary Key, Field ไหนที่เป็น Required Fields, Field ไหนที่ห้ามมีขนาดตัวอักษรเกิน 50 ตัวอักษร
  • ทำการ Copy Code ได้จากที่ลื้งข้างล่างนี้นะครับ
  • กลับไป Apply Database Configuration ต่อที่ DataContext โดยทำการ Override Function OnModelCreating ดังนี้
protected override void OnModelCreating(ModelBuilder builder)
{
builder.ApplyConfiguration(new ProvinceConfiguration());
builder.ApplyConfiguration(new PointOfInterestConfiguration());
}

สร้าง Seed Data

  • เพิ่ม File ใหม่ชื่อ Seed.cs และทำการ Copy Source Code ในลิ้งข้างล่างนี้
  • เราจะใช้ Script ในการเพิ่มสถานที่น่าสนในใจจังหวัดขอนแก่นและจังหวัดกรุงเทพ ในการ Seed Data ลงไปยัง Database อีกทีในตอนที่เรารัน API Project นะครับ
ตัวอย่างการเตรียม Source Code ไว้ทำการ Seed Data ครับ

พัฒนา Repository Pattern

หลังจากที่เรามี DataContext ในการต่อกับ Database แล้ว คราวนี้ก็จะมาถึงขั้นตอนที่เราจะนำ DataContext มาพัฒนา Repository Pattern เพื่อให้ Core Project เรียกใช้ได้ที่ Service Class นะครับ ใครเหนื่อยก็พักซักหน่อย หายเหนื่อยแล้วก็…ลุย !!!

อันดับแรกให้สร้าง Folder Database/Repositories เสร็จแล้วให้สร้าง Files ดังนี้นะครับ

  • _BaseRepository.cs => พัฒนา _IBaseRepository ด้วย DataContext
  • ProvinceRepository.cs => เน้นการจัดการข้อมูลที่เกี่ยวกับ Domain Model Province จาก Domain Project
  • PointOfInterestRepository.cs => เน้นการจัดการข้อมูลที่เกี่ยวกับ Domain Model PointOfInterest จาก Domain Project

ถ้าเรามี Business Domain ใหม่ๆ เราก็สามารถเพิ่ม Repository Interface เข้ามาอีกได้นะครับ

ให้ทำการ Copy Code จากลิ้งข้างล่างนี้นะครับ

ใน BaseRepository เราจะทำการพัฒนา IBaseRepository ด้วยการนำ DataContext มาใช้ในการติดต่อกับฐานข้อมูลนะครับ โดยตั้งเป้าไปที่การทำ CRUD ซึ่งการแก้ไขข้อมูลจะถูกบันทึกลง Datavase ก็ต่อเมื่อเราใช้คำสั่ง SaveChangeAsync นะครับ
ใน ProvinceRepository นั้นเราจะทำการพัฒนา IProvinceRepository โดยการสืบทอด BaseRepository<Province> เพื่อนำ Code บางส่วนที่พัฒนามาตราฐานของ IBaseRepository<Province> แล้วมาใช้นะครับ
ใน PointOfInterestRepository นั้นเราจะทำการพัฒนา IPointOfInterestRepository โดยการสืบทอด BaseRepository<PointOfInterest> เพื่อนำ Code บางส่วนที่พัฒนามาตราฐานของ IBaseRepository<PointOfInterest> แล้วมาใช้นะครับ

พัฒนา Email Provider

หลังจากที่เราได้กำหนด Email Provider Interface ใน Core Project แล้ว ในขั้นตอนนี้เราจะทำการพัฒนา Email Provider ให้สามารถใช้งานได้ดังนี้นะครับ

เริ่มต้มด้วยการสร้าง Folder ชื่อ Email เสร็จแล้วให้เราทำการสร้าง Files ดังนี้ และ Copy Code จากลิ้งข้างล่างนะครับ

  • MailGunEmailProvider.cs => พัฒนาการส่งเมล์โดยการสมมติว่ากำลังต่อกับ Email Provider ชื่อ MailGun
  • MailGunEmailProviderOptions.cs => เป็น Option Pattern สำหรับ MailGunEmailProvider.cs เพื่อเป็น Configuration ในการติดต่อกับ MailGun
  • SendgridEmailProvider.cs => พัฒนาการส่งเมล์โดยการสมมติว่ากำลังต่อกับ Email Provider ชื่อ Sendgrid
  • SendgridEmailProviderOptions.cs => เป็น Option Pattern สำหรับ SendgridEmailProvider.cs เพื่อเป็น Configuration ในการติดต่อกับ Sendgrid
ที่ตั้งใจเตรียมตัวอย่างมา 2 Email Providers เพื่ออยากสื่อให้เห็นว่าเราสามารถที่จะสลับมาใช้ Email Provider เจ้าอื่นได้โดยที่ไม่กระทบกับ Code ที่นำไปเรียกใช้เลยครับ เพราะจะเรียกผ่าน IEmailProvider ซึ่งเป็นมาตาฐานกลางของเราอยู่แล้ว แต่ในบทความนี้ไม่ได้ต่อไปจริงๆน้าา แค่ Return string กลับมาให้เห็นแนวทางการใช้ Option Pattern ในการจัดการกับ Configuration นะครับ

--

--

Ponggun
T. T. Software Solution

Development Manager, Web Developer with ASP.Net, ASP.net Core, Azure and Microsoft Technologies