สำหรับในบทความนี ้เราจะมาเริ่มจัดการโปรเจคของเราออกเป็น N-Tier โดยจะแบ่งออกเป็น Part ย่อยๆ โดยในส่วนแรกนั้นเราจะมาทำการแยก Models และ Connection ออกไปไว้อีกโปรเจคหนึ่งกันก่อนครับ

สำหรับเนื้อหาของ N-Tier สามารถศึกษาได้ที่นี่ครับ https://stackify.com/n-tier-architecture/

เริ่มแรก ให้ทำการเพิ่มโปรเจค แบบ class library เข้ามา โดยจะใช้ชื่อโปรเจค Todo.Models

โดยตัว Solution Architechture จะมีลักษณะ ดังนี้

จากนั้น เราจะมาสร้างโฟลเดอร์เพื่อใช้สำหรับจัดกับ Class ต่างๆ โดยจะมี ดังนี้

ขั้นตอนต่อไป เราจะทำการย้าย Class ที่อยู่ในส่วนของตัวโปรเจค Todo.API โดยจะย้าย Class ในโฟลเดอร์ ดังนี้ Models, Enum และ Connections มาไว้ภายใน
โปรเจคนี้

ขั้นตอนต่อไป ทำการเปลี่ยน Namespace ของแต่ละ Class ให้ตรงกับโปรเจค ดังภาพ

และจะสั่งเกตุได้ว่าในไฟล์ชื่อ ApplicationDbContext.cs ยังจะ Error อยู่

ต่อไปเราจะทำการเพิ่ม Packages ของ EntityFrameworkCore เข้ามา โดยจะทำการเพิ่ม Packages ดังนี้

- Microsoft.AspNetCore.Identity
- Microsoft.AspNetCore.Identity.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Analyzers
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.Relational
- Microsoft.EntityFrameworkCore.Tools

จาก Package ข้างต้น เนื่องจากว่า เราจะสร้างระบบสำหรับ Sign-In ของ User เพื่อให้มีสิทธิ์ในการใช้งานระบบได้ โดยที่ Package ที่ชื่อ Microsoft.AspNetCore.Identity.EntityFrameworkCore จะเป็นการข้อมูลสำหรับเข้าระบบ เพื่อไม่ให้เสียเวลา เรามาดูกันเลยว่าต้องปรับเปลี่ยน ApplicationDbContext.cs เรายังไงกันบ้าง

สำหรับขั้นตอนแรก เราจะมาสร้าง Class เปล่าๆ ในโฟลเดอร์ Models โดยจะใช้ชื่อ ดังนี้

- ApplicationRole.cs
- ApplicationUser.cs

หลังจกที่สร้างครบแล้ว เราจะมาเริ่มกันที่ไฟล์ ApplicationRole.cs กัน โดยเราจะทำการ inherit ความสามารถของ Class ชื่อ IdentityRole มานำมาสร้างเป็น Object สำหรับใช้ Mapping Table สำหรับจัดเก็บข้อมูล แต่เนื่องด้วยตัว Pimary Key เดิมอาจจะไม่ตรงกับความต้องการ ทำให้เราต้องเปลี่ยน Data type ให้ตรงกับความต้องการ ซึ่งโค๊ดในส่วนนี้ จะมีดังนี้ (ขอรวบเอาไว้ในไฟล์เดียวกันเลยนะคับ)

using System;
using Microsoft.AspNetCore.Identity;
namespace Todo.Models.Models
{
public class ApplicationRole : IdentityRole<Guid>
{
}
public class ApplicationUser : IdentityUser<Guid>
{
}
}

และสำหรับขึ้นตอนนี้ ผมจะทำการเพิ่ม Property เพื่อใช้สำหรับจัดเก็บข้อมูล Firstname และ Lastname ในส่วนของ ApplicationUser.cs ดังนี้

และผมจะทำการเปลี่ยนชื่อ Class จาก Todo เป็น TodoTask

ต่อไปเราจะไปทำการปรับโค๊ดในส่วนของ ApplicationDbContext.cs กัน โดยขั้นตอนแรกเราจะเปลี่ยนจากที่เราต้อง Inherit DbContext เข้ามา เป็น IdentityDbContext และเนื่องจากเรามีการสร้าง ApplicationUser และ ApplicationRole ทำให้เราต้องทำการเพิ่ม 2 Class นี้ให้กับ IdentityDbContext ดังนี้

จากนั้นให้ลบโค๊ดในส่วนของ Constructor ทั้ง 2 ตัวออก รวมทั้งตัวแปร Configuration และ ContextOptions ออกด้วย

แล้วจากนั้นให้เพิ่ม using เข้ามาในส่วนหัวของ Class เพื่อเรียกใช้งาน EntityFrameworkCore

using Microsoft.EntityFrameworkCore;

และให้เพิ่ม Constructor ใหม่เข้าไป ดังนี้

จากนั้นให้ลอง build โปรเจค Model ดูว่ามี Error อะไรหรือไม่ หากไม่มีเท่านี้โปรเจค Todo.Models ก็พร้อมเรียกใช้แล้ว

สำหรับโปรเจค Todo.API ในตอนนี้จะยังไม่สามารถทำงานได้ เนื่องจากเรายังไม่ได้ Add Reference ตัว Todo.Models ให้เลยทำให้ยังมีปัญหาอยู่ ทีนี้เรามาลอง Add Reference เข้ามากัน ดังนี้

คลิกขวาที่ Dependencies ที่โปรเจค Todo.API แล้วเลือกคำสั่ง
Add Project Reference ดังภาพ

จากนั้นจะมีหน้าต่าง Reference Manager ขึ้นมา ดังนี้

ให้คลิกเลือกที่ Todo.Models เพื่อ Add Reference เข้ามา และคลิกที่ OK

จากนั้นกลับไปที่ Controller แล้วเพิ่ม using เข้ามา

using Todo.Models.Contexts;
using Todo.Models.Models;

จากนั้นให้เปลี่ยนคำสั่งในส่วนของ Models.Todo เป็น TodoTask ใน Methods ต่างๆ ดังภาพ

และจากนั้นให้ลบโฟลเดอร์ Migrations ออก เพราะไม่สามารถใช้งานร่วมกับ Identity Model ที่ทำใหม่ได้

และที่ส่วนสุดท้ายใน Start.cs ให้เพิ่ม using เข้าไป

using Todo.Models.Contexts;

รวมทั้งอย่าลืมลบ using ที่ไม่ได้ใช้งานออกด้วย หลังจากนั้นให้ลอง Build Solution ใหม่ ก็จะ Build Success แล้ว

Source code: https://github.com/VatthanachaiW/todo-project/tree/todo-task-three-n-tier-part1