สำหรับวันนี้จะเป็นสรุปแบบลูกผสมนะครับ คนละครึ่ง OnSite 50% / Online 50% พอดีมีแว๊บๆไปอีกงาน dotnetconf เป็นงานที่จัดพร้อมกัน หลังงาน Global จัดตอนช่วงกลางเดือน nov ในไทยมีจัดตั้งแต่ปี 2018 แล้วครับ ผมเขียน Blog นะไว้บางปีนะ
ปีนีหลายหัวข้อ net10 / testing / azure / aspire / ai agent / unity / vs 2026 บราๆ หัวข้อที่จดๆมาประมาณนี้ครับ
Table of Contents
KeyNote
Speaker Vasupon Thankakan
📌 Recap Microsoft Ignite Empowering Developer ในส่วน Developer โดย Key "How ms can empower developer to acheive more" โดยที่มี AI มาเป็นตัวเร่ง
📌 ปี 2028 Garther คาดการณ์ไว้ว่า งาน day to day operation อย่างน้อย 15% จะถูกจัดการ โดน agentic ai
📌 สิ่งที่ Microsoft เตรียมมาให้มี 2 มุม
- Agent Builf stuff for you
- You build your Agents
1 Agent build Stuff for you

📌 Wave 1 - GitHub Copilot - Pair Programmer ตอนแรกที่เราุ Ask ปีนี้มีในส่วน Edit / Agent Mode ด้วย เหมือนเห็นแว๊บใน VS Code ว่ามีส่วน Plan ด้วยและ แล้วมี Model ให้เลือกหลายค่ายเลย นอกจากกลุ่ม OpenAI
📌 Wave 2 - ถ้าเข้าไปที่หน้าเว็บของ GitHub มีส่วน Coding Agent ให้เราสั่งงานให้ AI (juniour dev / Peer programmer) ให้ลองไปแก้ bug ทำ POC จากนั้นเวลาแก้เสร็จ ของไม่ได้เข้าเลยนะ มันมี Process Pull Request ซึ่งเรา + AI Agent มา Review Code
📌 Wave 3 - กำลังจะมา Hybrid Team + Agent - ตัว Agent HQ มาจัดการ เขื่อม Claude Code / Open AI Codex ให้ทำงานด้วยกันได้
Tools อีกหลายตัวเปิดตัวมาในปีนี้ ตัว CLI หรือ Custom Agent ที่เอามาทำ Domain Specifc ที่มาช่วย boost productivity
2 You build your Agents
📌 Rename Azure AI Foundary to Microsoft AI Foundary มองว่าไม่เฉพาะ Azure
- มี AI Agent Service และมี พวก IQ ทำ RAG /Graph RAG
- นอกจากยังมีตัวจัดการ การใช้ Model ทำให้มัน transparency ที่สุด และมี observability + security
- Foundary Model มี Model หลายแบบให้เลือก ทั้งจาก Commercial และ OSS
📌 ส่วนของ Coding จะมีตัว Microsoft Agent Framework - มีขยายความหัวข้อถัดไป

📌 ปิดท้าย show use case ของ commerzbank ที่เอา ai มา adapt กับ mobile banking ให้เป็น agent ส่วนตัวที่ช่วยจัดการเรื่องการเงินต่างๆให้ง่าย การพูดคุย หรือ อ่านหน้าจอ ช่วยให้คนบางกลุ่มเข้าวเทคโนโลยีได้ด้วย อย่างผู้สูงอายุ โดยที่ Cost Per Token ตอนนี้ค่อยลดลงเรื่อยด้วย
Microsoft Agent Framework
Speaker Surasuk Oakkharaamonphong
📌 อย่างแรกก่อน ตอนนี่้ ถ้าใช้ยังใช้ Semantic Kernel / Auto Gen เค้าจะแจ้งให้ Migrate ไป Microsoft Agent Framework แทนแล้วนะ การ Migrate
- Manual - Semantic Kernel / Auto Gen
- AI - ใช้ตัว GitHub Copilot For App Modernization ได้นะ
ใช้ครับ ผมเพิ้งทำ App Semantic Kernel ต้องย้าย 555

📌 ทำไมต้อง Agent Framework ตอนนี้มี Framework ของ AI หลายตัว Semantic Kernel / Auto Gen / กลุ่ม 365 ก็มีด้วยอีก เลยรวบมาเป็นอันเดียว เพื่อให้เชื่อมต่อได้ง่าย มีรอบรับพวก Tools ในตัว เสียบ LLM ได้สะดวก รองรับ Observability ด้วยเป็นต้น
📌 Getting Start (Required NET10)
- NuGet
dotnet package add Microsoft.Agents.AI.OpenAI --prerelease -- Case Use Azuere dotnet package add Microsoft.Agents.AI --prerelease dotnet package add azure.AI.OpenAI
- Create Client
-- OpenAI
var openAiClient = new OpenAIClient('YOUR_API_KEY');
-- Azure OpenAI
var credential = new ApiKeyCredential('YOUR_API_KEY');
IChatClient azureOpenAiClient = new AzureOpenAIClient(new Uri('YOUR_END_POINT'),credential)- Create Agent
var translator_agent = azureOpenAiClient
.GetChatClient('Model_Name_But_in_Azure_is_Deplotment_name')
.CreateAIAgent(
name: "translator",
instructuion: "Thai translator"
);
-- test
Console.WriteLine(await translator_agent.RunAsync(message: "Hello"));- Create Agent With Tools
static string GetCurrentTime() => DateTime.Now.ToString("yyyyy-MM-dd HH:mm:ss");
var time_agent = azureOpenAiClient
.GetChatClient(deploymentName: "gpt-40-mini")
.CreateAIAgent(
name: "Time",
instructions: "You're timekeeper",
tools: [AIFunctionFactory.Create(method: GetCurrentTime)]
);
-- test
Console.WriteLine(await time_agent.RunAsync(message: "What's time is it?"));- Tools with API
static async Task-string Getweather(string location) => await new HttpClient().GetStringAsync()
var weather_agent = azure_openai_client
.GetChatClient(deploymentName: "gpt-40-mini")
.CreateAIAgent (
name: "Weather",
instructions: "You're weather forecaster"
tools: [AIFunctionFactory.Create(method: GetWeather)]
-- test
Console.WriteLine(await time_agent.RunAsync(message: "What's Weather")));📌 Getting Start DevUI (Required NET10)
- NuGet
dotnet package add Microsoft.Agents.AI.DevUI --prerelease
- Add Code ลองไปแงะที่ผมเพิ่มใน project ส่วนตัวนะ หลักจะเพิ่ม
var builder = WebApplication.CreateBuilder();
// Create LLM Client + Regis 2 DI
var chatClient = azure_openai_client
.GetChatClient(deploymentName: "gpt-40-mini")
.AsIChatClient();
builder.Services.AddChatClient (chatClient);
builder.AddAIAgent(name: "Translator", instructions: "Translate text into Thai Language");
static async Task-string Getweather(string location) => await new HttpClient().GetStringAsync()
builder.AddAIAgent(name: "Weather", instructions: "You're a weather forecaster")
.WithAITool(AIFunctionFactory.Create(method: GetWeather, name: "get_weather");
builder.Services.Add0penAIResponses();
builder.Services.AddOpenAIConversations();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
//Needed for DevUI to function
app.MapOpenAIResponses();
var builder = WebApplication.CreateBuilder();
// Create LLM Client + Regis 2 DI
var chatClient = azure_openai_client
.GetChatClient(deploymentName: "gpt-40-mini")
.AsIChatClient();
builder.Services.AddChatClient (chatClient);
IHostedAgentBuilder ThaiTranslator = builder.AddAIAgent(name: "Translator", instructions: "Translate text into Thai Language");
static async Task-string Getweather(string location) => await new HttpClient().GetStringAsync()
IHostedAgentBuilder Weather= builder.AddAIAgent(name: "Weather", instructions: "You're a weather forecaster")
.WithAITool(AIFunctionFactory.Create(method: GetWeather, name: "get_weather");
builder.Services.Add0penAIResponses();
builder.Services.AddOpenAIConversations();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
//Needed for DevUI to function
app.MapOpenAIResponses();
app.MapOpenAIConversations();
app.MapDevUI();
}
app.Run();- result

📌 Getting Start Workflow (Required NET10)
- Code เดิมนะ แต่เราต้อง Register Agent
var builder = WebApplication.CreateBuilder();
// Create LLM Client + Regis 2 DI
var chatClient = azure_openai_client
.GetChatClient(deploymentName: "gpt-40-mini")
.AsIChatClient();
builder.Services.AddChatClient (chatClient);
builder.AddAIAgent(name: "Translator", instructions: "Translate text into Thai Language");
static async Task-string Getweather(string location) => await new HttpClient().GetStringAsync()
builder.AddAIAgent(name: "Weather", instructions: "You're a weather forecaster")
.WithAITool(AIFunctionFactory.Create(method: GetWeather, name: "get_weather");
builder.Services.Add0penAIResponses();
builder.Services.AddOpenAIConversations();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
//Needed for DevUI to function
app.MapOpenAIResponses();
var builder = WebApplication.CreateBuilder();
// Create LLM Client + Regis 2 DI
var chatClient = azure_openai_client
.GetChatClient(deploymentName: "gpt-40-mini")
.AsIChatClient();
builder.Services.AddChatClient (chatClient);
IHostedAgentBuilder ThaiTranslator = builder.AddAIAgent(name: "Translator", instructions: "Translate text into Thai Language");
static async Task-string Getweather(string location) => await new HttpClient().GetStringAsync()
IHostedAgentBuilder Weather= builder.AddAIAgent(name: "Weather", instructions: "You're a weather forecaster")
.WithAITool(AIFunctionFactory.Create(method: GetWeather, name: "get_weather");
builder.AddWorkflow("weather-thai", (sp, key) =>
{
IEnumerable<AIAgent> agentsForWorkflow = new List<IHostedAgentBuilder>() { Weather, ThaiTranslator }.Select(ab => sp.GetRequiredKeyedService<AIAgent>(ab.Name));
return AgentWorkflowBuilder.BuildSequential(workflowName: key, agents: agentsForWorkflow);
}).AddAsAIAgent();
builder.Services.Add0penAIResponses();
builder.Services.AddOpenAIConversations();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
//Needed for DevUI to function
app.MapOpenAIResponses();
app.MapOpenAIConversations();
app.MapDevUI();
}
app.Run();- result

Resource https://www.youtube.com/watch?v=Lcd651kL0X0
.NET Ecosystem For Sustainable SLMs with Foundry Local: Tools, Techniques, and Tomorrow
Speaker Charunthon Limseelo
Why SLM
📌 ปัญหาของ LLM มันใช้ Resource ที่เยอะมาก เกิดความร้อนสูง แล้วพอคนใช้เยอะ เจอปัญหา Outage บ่อยๆด้วย
📌 แล้วถ้าเอา Server LLM เอง มันใช้ Cost HW สูงด้วย นอกจากนี้ตัว Model ยังมีแบบ Proprietary (จ่ายเงิน) / Open Models (OSS)
📌 SLM เลยมาตอบโจทย์ตรงนี้เพราะเราไม่ได้เอา LLM ไปตอบปัญหาเฉพาะเรื่อง เลยเป็นที่มาขอ SLM ที่เน้น Train Specfic Domain และลด Parameter ลง โดยวิธีที่นิยม Quantization เพื่อให้มาตอบโจทย์ มุม Cost efficient / Privacy / Security / Latency / Bandwidth / Space (กรณีที่ไปยัด On Device) โดย Model ที่นิยมมีตามนี้

ถ้าเราใช้งาน Local SLM Model มีปัญหาอะไรบ้าง
📌 Format ที่หลากหลาย
- GGUF/GGML
- ONNX
- MLX - ของฝั่ง Apple
- Safetensors/Torch ของ PyTorch

📌 ตามมาด้วยเรื่องจุกจิของการเลือก Runtime มีจดไว้ในอีก Meetup ของ Global AI BKK 2025
📌 Spec ที่ใช้ สำหรับ inference ใช้ทั่วไป คนเดียว
- Windows / Mac / Linux (ถ้าใช้ Local Foundary มี Windows / Mac)
- RAM Min 3 / Recommend 15 GB / Disk Min 8GB Recommend 15 GB
- CPU / GPU + NPU For Acceleration)
📌 ตัวที่ช่วยให้เราใช้งาน Model ได้ง่ายๆมี Ollama / Microsoft Local Foundary
- Ollama ถ้า Run CPU ต้องใช้ docker / ไปทำ ModelFile เอง
- Microsoft Local Foundary เปิดตัวมาสักพักแล้ว มียกเครื่องใหม่ใน Version ล่าสุดไป
Microsoft Local Foundary หละ


📌 เทียบความแตกต่างกันต่อ Foundary ใน WinML มี ONNX Runtime มัน Optimize กับ Windows รวมถึงใช้ NPU ได้ด้วย
📌 ปรับ Local Foundary Archtiecture
- เดิม ต้องลง Foundary CLI ด้วย ทำให้ภาพ APP > Call Foundary CLI > Call Model
- ใหม่ ลดขั้นตอนลง APP มี SDK ไม่ต้องลง Foundary CLI APP > Call Model
📌 ถ้าเอา App เชื่อมต้องเพิ่ม NuGet ตามรูป

เลยได้เป็นโจทย์มาลองว่า Format Model แบบไหนมี Perf ดีสุด
📌 Disclaimer การทดสอบ ทำบนเครื่อง Spec ของ Speaker อย่างเดียว มันมี 1 Data Point สำหรับส่วน HW
📌 Runtime เลือกมา 2 ตัว
- Ollama (GGUF Format)
- Foundry Local (ONNX Format)
📌 Model Qwen 2.5:1.5b
📌 วัดโดย ลองทำ App .NET ขึ้นมา แล้วใช้เจ้า System.Diagnostics.PerformanceCounter เข้ามาวัดการใช้ CPU / Memory
📌 ผลที่ได้ตามนี้


📌 ถ้าอยาก Optimize Model มากกว่านี้ น้องโบ๊ทได้แนะนำ 3 เทคนิค
- Reduce Compute - caching, knowledge distillation (Python)
- Speed-up Decoding - parallel / speculative decoding โดยใช้ตัว Microsoft.ML.Tokenizers
- Reduce storage needs - Quantization ลด Param > ลดพื้นที่ใช้ของ Model แต่ต้องมาตรวจด้วยนะว่ายังฉลาดเหมือนเดิม
Resource: Slide / Source Code
Exploring Microsoft Foundry for Developer
Speaker Teerasej Jiraphatchandej
📌 จากเดิมมี WinApp / WebApp / MobileApp โดยทุกอย่างถูกกำหนด Flow ไว้แล้ว จาก Developer
📌 พอมี AI เข้ามา Use Case แรก App Chat (Copilot / ChatGPT) หรือ Filter ต่างๆ ของ IG / TikTok
📌 ตอนนี้มีแนวคิดของ Agentic AI มีการ Integrate Model เข้ากับ App ทำให้ Flow หลากหลายขึ้น ทั้งในส่วนของ Core Logic เช่น การเอามาตัดสินใจ และ ส่วนเสริมต่างๆ เช่น การทำอธิบาย และจากเดิมที่เราเอา 1 AI ทำทุกอย่างจะเป็นยุคของ Multi-Model ทำตามความเชื่ยวชาญ
นอกจากนี้ในปี 2028 IDC คาดการณ์ว่า เรามี AI App 1.3B ที่ถูกสร้างขึ้นมา
📌 แล้วอะไร Model / Agent มันต่างกันยังไง
- Model เป็นสมอง ถามตอบเป็น Text แบบ ChatGPT ตามความรู้ที่มันมี
- Agents นอกจาก Model เป็นสมอง
- knowledge หาข้อมูลเพิ่มเติม ทำพวก RAG / Graph RAG / MCP Server
- actions ตามงานเฉพาะอย่าง เช่น การส่งเมล์ / จัดการข้อมูลใน DB เป็นต้น
📌 แต่ถ้าเราจะไปเริ่ม AI App จากศูนย์เลย มันอาจจะลำบาก ทาง MS เลย ลองทำ
Azure AI Studio > Azure AI Foundary > Microsoft AI Foundary (MS Ignite 2025)
Microsoft Foundry
Microsoft Foundry เป็น PaaS ที่ช่วยจัดการ AI Inference ให้ง่ายชึ้น อยู่ตรงกลางระหว่าง
- SaaS เป็นส่วน Copilot Studio ทำงานแบบ Low Code/No Code
- IaaS เช่า HW GPU CPU Disk บน Azure แล้วติดตั้ง Runtime เองเลย

ในตัว Microsoft Foundary มันแบ่งเป็นหลายส่วนนะ ทั้ง
- Models / Agent Service / IQ (ทำพวก RAG + Knowledge Base) / Tools ถ้า Advance ส่งงานต่อให้ Azure ML ได้นะ
- มี Control Plane เอามาดู Governance และ Observability ต่างๆ
Demo Microsoft Foundry ต้องไปปรับ Flag ก่อนนะ
📌 Home เป็นทางลัดสร้าง Agent / Workflow /เลือก Model
📌 Discover

- Model ให้เลือกหลายค่ายทั้ง commercial พวก claude grok มรเข้ามาด้วยนะ / oss รใมถึงการเอา model มา comparw
- Tools ว่ามีอะไร เป็น connector ต่างๆ จัดการ DB หรือ MCP Tools หรือ ทำเองก็ได้
📌 Build Agent - สร้าง Agent ก่อนสร้างต้องรู้ Goal ก่อนนะ เอามาแก้ปัญหาเรื่องอะไร ถ้าพร้อมกำหนดชื่อ Agent เลือก Model และลองกำหนดค่าใน Playgroud

- instruction - บอก System Prompt คุมโทน การทำงาน ต้องมีความชัดเจน
- tools พวกเอกสารต่าง ให้ AI มาหาตอบ ทำ RAG
- knowledge ทำ grounding ตรวจสอบ
- memory - จดจำ State การทำงาน
📌 Build Workflow เอา Agent มาทำงานร่วมกันมี 3 แบบ
- Sequential
- Human in the loop - งาน Approve ต่างๆ
- Group chat - Dynamic workflows, escalation, fallback, expert handoff scenarios.
ในงานจะเป็น demo สำหนับ Sequential - เราลาก flow แบบ n8n แล้วถึง node agent เราสามารถเลือก agent ที่สร้างจาก step ก่อนหน้าได้ โดยใน Demo มี Flow
User Input > Marggies Agent (วางแผนท่องเที่ยว) > Expense Agent มาคุมเงิน > ผลลัพธ์
- เมื่อทดสอบ Workflow แล้ว เราเราสามารถ publish ลง ms team หรือ m365 copilot ได้
📌 Operate ส่วนที่ติดตามการใช้งานขอว Model เรา ในส่วน Agent ดูพวก governnance หรือ token usage ได้
📌 Doc
Resource: Microsoft Foundry
Pushing for Black Box Testing when everyone Love's Unit tests
Speaker Joel Dickson
📌 ถ้าเรามี Endpoint อันนึง เช่น POST /Order (Controler + Repositoty Pattern) จากนั้น Team เขียน Test หมดทุก Level Controller > Service


📌 ตัว CI Coverage 90% และ green (ไม่มี Fail Test) - Code ที่เขียน AI / ของจริง
📌 คำถาม 2 ข้อ ผมแอบไปเล่นช่วงแรก 555 คือ Assumtion ข้างต้นมีปัญหาไหม และทุกวันนี้แต่ละที่กำหนด Code Coverage กันเท่าไหร่


📌 จาก Code ข้างต้น ถ้าแก้ Endpoint มันจะบึ้มไหม สรุป Test ไม่พัง แค่ลองยิงจริงพังนะ 404

📌 แล้วอีกแบบถ้า ใน Code เรา Constructor มันรับ Param มาเยอะ ถ้าเพิ่ม Param + Dependency ใหม่จะพังไหม สรุป พังนะ ที่มันพัง อันนี้ Uncle Bod แกเรียกว่า Rigidity พอ Code มันซับซ้อน มันใหญ่ขึ้น เวลาแก้ที่นึง Test พังเต็มไปหมด

📌 Key เราไป Test ผิดประเด็น หรือป่าว ไปดูตาม
- Class / Framework / Mock Gang / Private Structure
- ขาด Input > Output / Behavoiur / Real Flows / Business Value
📌 A Side Effect on this is it' impact on refactoring
- เพราะ Test มัน brittle (เปราะ) มันทำให้คนกลัวปรับ Design / Logic / และสุดท้ายปล่อยมันไว้แบบนั้น กลายเป็นตำนาน ข้อเสียมันไม่ Response to Change
- และมีคำถาม ถ้า Test มัน brittle (เปราะ) เราจะกล้า Refactor ไหม คำตอบพอๆกันเลย

แล้วทางแก้ ทำยังไง ฺBlack Box Testing
📌 มันการทดสอบระบบให้ได้มากที่สุด หลายที่อาจจะมีคำเรียกต่างออกไป อย่าง System Test / Integration Test โดยปรับจุดที่ Mock ลดลง เพื่อให้เห็น Flow รวมมากขึ้น

📌 ข้อดีของการทำแบบนี้
- Real Routing
- Real Serializing
- Real Model Binding
- Real Error Formattong
- Real Dependency Injecting wiring
- Real Startup Config
- Test คงทนกับการ Refactoring ฃ
- ยังมี Regression ได้
- ไม่พังง่าย จากการปรับด้านใน
- Test Real Behaviour from Client
📌 พอเราเอา WebApplicationFactory เอามาช่วยในการ มันจะช่วยลดเรา Inject Mock เข้าไปได้เลย ฟังแล้ว Framework ที่ทำใช้กันทำคล้ายกัน รวมถึง Override Config บางอย่าง เช่น JSON Config หรือ ไปใช้กับ Test Container ก็ได้นะ


📌 TestCaseData ของ NUnit ถ้ามีเยอะ ให้เรียก SetName เพื่อกำหนดชื่อด้วย จะได้ตาม Track ได้ง่าย
Testing Pyramid ยังจำเป็นอยู่ไหม ?


- Testing Pyramid อาจจะเหมาะกับระบบที่เป็น Monolidth
- แต่ถ้าเป็น Microservice ควรขยับไปใช้ Testing Honeycomb (เสนอจาก Spotify Team) ที่เน้นไปในส่วน Integration
- Complexity มันย้ายจากข้างในออกมาเป็น Interaction ระหว่าง API
- ถ้า Arch แบบนี้นิยามของ Test Coverage ควรเปลี่ยนไปจาก ดูจากข้างในออกมาจุด Interaction Point (API / Message Queue / DB) ทำ Test ด้านในอย่าง Unit Test ยังมีนะ แต่ไปเน้นจุดที่มันซับซ้อน มี Detail ตอน Implement
📌 สุดท้าย Unit Test ยังสำคัญ และจำเป็นอยู่นะ แต่ต้อง Test ให้ถูกที่ถูกทาง
- ถ้าระบบมันรับของมาจาก Call ส่ง Param จาก Code มันยังใช้ได้ รวมถึงแนวคิด Testing Pyramid
- ถ้าระบบมันรับมาจาก REST API + Distribute System (Microservice) มันควรปรับวิธีการ Test เหมาะสมกับมัน
Q&A
📌 Mution Test Testing ทำได้ไหมช่วยเรื่อง Quality ?
- แนวคิดของ Mutation Test ดี แต่ Key Enviroment Support มัน ทำจริงมันซับซัอนกับการแก้ค่าที่ละตัว ใน dotnet มีนะตัว Stryker.NET ภาษาอื่น ถ้าทำลองหา Lib มาช่วยอย่าง Kotlin / Scala ..
📌 พวก Message Queue อันนี้ Test ยังไง ?
- Mock จาก WebApplicationFactory / ใช้ TestContainer แต่มันใช้ Cost ระดับนึงตอน Startup / TearDown ถ้าลดเวลา ดูเรื่อง Parallel
📌 What is actual benefit to break monolith
- Velocity - เพราะทุกอย่าง Break เล็กลง ทำให้ CI ใช้เวลาลดลง Test ได้ง่ายขึ้น ทำที่เครื่องตัวเองก็ได้ และทำส่วนของ DORA metrics ขึ้นดี พอเล็กลงมันปรับเร็ว ตอนสนองได้เร็ว
📌 Test Coverage For each Test Level App / System, Which Strategy
- System Level - Microservice / Unit Test - monolith
Beyond Swagger UI: Practical Uses of OpenAPI in .NET 10
Speaker Ratchapol Anantawat
📌 เวลาเราทำงานร่วมกันอย่างทีม Dev Order Team กับ Dev อีกทีม Team (Marketing) อันนี้เราทำอย่างไรกัน
📌 เมื่อก่อนให้ Dev Design API มาก่อน 2 month แล้วให้ End User Test 2 month ปัญหา
- Documentation ไม่ตรง อุ่ยเลยเพราะไปทำ API กับอีกเจ้าเจอแบบนี้เหมือนกัน
- Drift Implementation - ตัว Data ที่ใช้งาน (Request / Response ใช้งานไม่ได้) / Implementation ไม่ตรงกัน
- Maintanance Problem
- Integration Problem - ถ้า API ชุดนี้ไปต่อกับระบบอื่น เปลี่ยนวิธีการข้างในมันก็เละ
- Onboarding Problem
📌 ทางแก้เอา OpenAPI เข้ามาใช้งาน โดยที่
- Dev Order Team
- Define Skeleton Endpoint Request + Response จากนั้น Code ง่ายๆ ไม่มี implement
- Generate OpenAPI Spec - ในส่วนของ CI/CD ทำส่วน Client Generation
- CI เอา Spec มาสร้างเป็น Code เอาไว้ยิง
- เอาขึ้น NuGet Server
- Deploy API - Dev Marketing Team- Start Develop
- เอา NuGet สร้างตาม Spec มาใช้งาน โดยมีใช้ Prism Mock Server
- Dev ระบบตาม API ที่ได้มาจาก Dev Order Team
- Parallel Development
Implementation

📌 Generate Swagger UI with dotnet 10
- SwaggerUI Swashbuckle.AspNetCore.SwaggerUl
- Scalar Scalar.AspNetCore
- ReDoc Swashbuckle.AspNetCore.ReDoc
📌 ถ้าเราต้องการให้ Open API Doc มันทุกรอบตอน Build ปกตืมันสร้างตอน Runtime {url}/openapi.json
- Install Lib Microsoft.Extensions.ApiDescription.Server
- Config csproj เพิ่ม ผลลัพธ์จะอยู่ตาม path OpenApiDocumentsDirectory ถ้าไม่ได้อยู่ที่ obj\[projectName].json
<PropertyGroup>
<OpenApiDocumentsDirectory>.</OpenApiDocumentsDirectory>
<OpenApiGenerateDocuments0ptions>
——file-name my-open-api
</OpenApiGenerateDocumentsOptions>
</PropertyGroup>📌 มาฝั่ง CI Server แล้ว ให้มัน Generate Open API Client + Publish NuGet โดยใช้
- OpenAPI Generator รองรับหลายภาษาอย่าง C# / Java / Kotlin / Go / TS เบื้องหลัง Code Java มาอ่าน Customize ได้จาก Mustache Template
- Kiota มาจาก Microsoft ของ MS รองรับแน่ๆ แต่ยังน้อยกว่าตัวแรก แนวคิดของมัน Simple (No Template) + Fast
- NSwag เป็นอีกตัว
📌 Automate Release with Conventional Commit ใช้ GitHub Action https://github.com/googleapis/release-please-action มันทำ Release / ChangeLog Auto จาก Commit เช่น เราขึ้นด้วย Fix มันนับ Version ตามให้

📌 Create Mock Server https://stoplight.io/open-source/prism เอา OpenAPI Spec มา Gen รองรับทั้งแบบ Static / Dynamic Example (Random/ Rule)
📌ใน Code มีคำอธิบายใส่ไว่ ถ้าในดูใน Code
- ส่วน minimal api มีใส่คำอธิบาย WithName / WithTags / WithSummary / WithDescription
- เพิ่ม Example ดูจาก AddOpenApiOperationTransformer - DTO อยู่ใน tag Description //ถ้าอยากได้ จาก summary tag ใน csproj ไปกำหนด GenerateDocumentationFile เป็น true เดียว engine มันไปอ่านตอนสร้าง API เอง
- JsonStringEnumConverter - เพื่อให้มันแปล Enum เป็น String จะได้เข้าใจง่ายว่า 1 2 3 คือ อะไร
- CI ในที่นี้ใช้
- Action Publish OpenAPI มีกำหนด suffix + openapi-generators action (C#)
- release-please-action จัดการ pull request - ที่นี่เรายัด Scenario ที่ต้องการลงใน Test ได้เลย
Source Code: https://github.com/ratchapol-an/openapi-usage
Running AI Models Inside Unity: The Power of the Inference Engine
Speaker Gittitat Ekchantawut
📌 3-4 ปีก่อน Speaker ได้พยายามเอา AI ยัดลง Mobile โดยใช้
- MediaPipe ปัญหา Integrate กับ Unity ยาก / มีความหลายของ Platfrom (Desktop / Android / iOS) / เอาผลจาก ML มาใช้กับ Game ยาก
- Custom Native Plugin มันเป็น C++ เลย Maintain ยาก Build ยาก และมี Learning Curve สูง
- Cloud มีปัญหา Internet / High Latency (Game Realtime) / Cost (Cloud Inference)
📌 ตอนนี้หละ Unity 6 มี Unity Inference ในตัว ที่ช่วยให้
- Run ONNX Model ได้ รองรับการใช้ GPU เอาพวก SLM / Model จาก PyTorch มาแปลงใช้ก็ได้
- ทำ Realtime Game Play โดยเบื่องหลังการทำงาน
Texture (เอาข้อมูลจากสภาพแวดล้อมใน Game พวกกล้อง การเคลี่อนไหว เป็นต้น)
> Tensor (แปลงข้อมูลตาม input AI ต้องการ)
> Inference (AI มันคิด)
> Output (ผลที่ได้)
> Gameplay- Multi Platform Support ด้วย ถ้าใช้ Android ต้องมาดู AR Core / iOS จัดการ AR Kit เพิ่มเติม และจุกจิมากมาย
- ตอนนี้ Unity รองรับ Windows / macOS / web / Android / iOS / เครื่อง Console ทำได้นะ แต่มีค่า License ของแต่ละค่าเพิ่ม
Demo with yolo
📌 yolo model - Realtime Object Detection Model
- ขนาดของ nano มัน 12 mb ถ้าอยากได้ความสามารถเพิ่มเติมแบบพวก Detect face จุดที่เป็น key อย่างหน้า ปาก ตัวเต็ม 100 mb
- ถ้าเมื่อก่อนใช้ MediaPipe จะได้ 300 mb
📌 ทำเป็น Game แบบ Fruit Ninja + yolo nano เล่นได้เลย


📌 Technical Challenge
- ถ้า Generative AI เข้ามายัดลง App อนาคตเรียกว่า ถ้า SLM เล็กลงกว่านี้ หรือ Bundle มากับ OS เราใช้ความสามารถนี้เรียกใช้ Model ใน App ของเราได้
- บาง Model ต้องปรับภาพให้มี ขนาดที่ต้องการ ก่อนส่งเข้าไป Inference
Source Code: https://github.com/menstood/dot-net-conf-2025
Aspire: The Unified Toolchain for Building Cloud-Native Distributed Apps
Speaker Md Rafee
Aspire คือ อะไร
📌 เป็น Tools ที่มี Template + Package ต่างๆ ช่วยให้ Application ของเราเป็น Cloud Native ได้ง่ายที่สุด Start จาก Local > Production รวมถึงมันมีพวก open telemetry ในตัวด้วยนะ
📌 Developer Friendly ทุกอย่างเป็น Config ตรวจได้ Clone ลงมา พอรันมันก็ Intial ทั้งหมดเลย มี Dashboard ให้มันเหมาะกับการตรวจปัญหาตอนทำงาน รวมถึงกรณีที่ต้อง On Boarding พนักงานใหม่ด้วย
📌 Local First Production Ready ยังไง มาดูรูปนี้ Front End เหมือนจะ Azure ตลอดนะ 555
📌 Build-In Developer Dashboard


- ทำให้ภาพรวม และความสัมพนธ์ของ Resource แบบ Resource Map ใน Azure
- Console ส่วนหน้า Dashboard เรา Customize Path ได้ เช่น scalar เป็นต้น
- ต่อไปเป็นส่วน open telemetry Structure Log / Trace / Metrice มาให้ในตัว
What's new in Aspire 13

📌 Support Python / JavaScript เพิ่มจากเดิมที่มี Java กับ Go อยู่แล้ว ตอนแรกคิดว่ามันใช้กับ dotnet stack อย่างเดียว เลยไม่ได้ลอง 555
📌 Polyglot infrastructure - รองรับหลายๆค่าย JDBC,
📌 Container files as build artifacts
📌 Improve CLI
📌 aspire do - enabling parallel execution, dependency tracking, and extensible workflows for building, publishing, and deploying applications.
📌 VS Code Extension
เบื่องหลังการทำงานของมันหละ
📌 จาก AppHost <-> Docker Compose พอใช้ AppHost มันเป็น C# TypeSafe ด้วย ถ้าเขียนไม่ผิด มันจะฟ้องตอน Compile เลย

📌 ที่นี้จาก AppHost จะเรียก DCP (Developer Control Plane) แอบไปอ่านเหมือนเขียนด้วย Go เพื่อไปคุยกับ Container Runtime อย่าง Docker Podman แล้วสร้าง Resource ขึ้นมา

ถ้าจะเริ่มต้องทำอย่างไร
📌 ติดตั้ง CLI
dotnet tool install --global Aspire.Cli -- Check Version aspire --version
📌 Start New Project
dotnet new aspire-starter --use-redis-cache -n AspireApp --output AspireApp aspire run
📌 จากนัันลองมาดู Map Code กันว่าแต่ละชิ้นประกอบขึ้นมายังไง พอ Register ด้วยชื่อมันทำ Service Discovery สามารถอ้างชื่อตรงๆได้แบบใน docker compose

📌 นอกจากในตัว Extension เราสามารถเพิ่มเติม Standard ของให้กับ ทุกๆ App ได้ เช่น Standard Logging/ Config ตัว OpenTelemetry

Resource build-your-first-aspire-app / Quickstart Aspire
ASP.NET Core 10 & C#14 "in action"
Speaker Giorgio Desideri
สำหรับ Talk นี้มา Recap ASP.NET Core 10 & C#14 ที่น่าสนใจ
📌 Open API มีเพิ่ม Config ใน Program.cs + / csproj คล้ายกับ Session ของ Beyond Swagger UI: Practical Uses of OpenAPI in .NET 10
📌 Minimal API - Validation
- register ใน Program.cs
builder.Services.AddValidation();
- จากลองมาดูตัวิอย่าง Validation ในส่วนของ Endpoint เค้าแยกให้ Code Clean เลยไฟล์ตาม Domain มานะ สังเกตจาก Tag Required + Error Message
app.MapGet(
"/api/v1/products/{productId}",
async (
[Required(AllowEmptyStrings = false, ErrorMessage = "ITEM_ID_NULL")] string productId,
IProductReadService service) =>
{
CancellationTokenSource cts = new CancellationTokenSource();
var result = await service.GetProductAsync(productId, cts.Token);
return Results.Ok(result);
}- ใน Record ก็มีนะ ไปส่องได้ ทั้ง Request / Response
- พวก save มี TypedResults.Ok (น่าจะมาตอน NET7) มาตอนส่งค่ากลับไป บอก medata ของ type ด้วย มีผลกับพวก OpenAPI
📌 Field Keyword - ลดการประกาศ property ซ้ำ
- old
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}- new
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}- ตัวอย่างใน Sample Code จะอยู่ใน Models/GetProductItem.cs
📌 Extension Blocks แยก Code ในชัดเจน ว่าอันไหนเป็นของ Type อะไร เป็น static หรือป่าว
- ตัวอย่างใน mslearn
public static class Enumerable
{
// Extension block
extension<TSource>(IEnumerable<TSource> source) // extension members for IEnumerable<TSource>
{
// Extension property:
public bool IsEmpty => !source.Any();
// Extension method:
public IEnumerable<TSource> Where(Func<TSource, bool> predicate) { ... }
}
// extension block, with a receiver type only
extension<TSource>(IEnumerable<TSource>) // static extension members for IEnumerable<Source>
{
// static extension method:
public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second) { ... }
// static extension property:
public static IEnumerable<TSource> Identity => Enumerable.Empty<TSource>();
// static user defined operator:
public static IEnumerable<TSource> operator + (IEnumerable<TSource> left, IEnumerable<TSource> right) => left.Concat(right);
}
}2 อันหลังไหนๆ เขียน Blog และเลยเติมๆให้ครบไปครับ
📌 Null-Condition Assignment มันลด Guard ไดัดี
- Old
Customer? cust = GetCustomerOrNull();
if (cust != null)
{
cust.Address = newAddress;
}- New ?. ทำไมนึกถึง TypeScript
cust?.Address = newAddress;
- Note-Some Case
customer?.Order = GetNextOrder(); // GetNextOrder() is only invoked if customer != null int? result = someObj?.Property = 5; // If someObj == null > Result = null a?.Count += delta; // a?.Count += delta; same as if (a != null) a.Count = a.Count + delta;
📌 Authentication
- ASP.NET Core Identity metrics - มี Default Metric สำหรับ Authentication / Authorization ไม่ต้อง Custom นับเองแบบเมื่อก่อนแล้ว
aspnetcore.identity.user.create.duration aspnetcore.identity.user.update.duration aspnetcore.identity.user.delete.duration aspnetcore.identity.user.check_password_attempts aspnetcore.identity.user.generated_tokens aspnetcore.identity.user.verify_token_attempts aspnetcore.identity.sign_in.authenticate.duration aspnetcore.identity.sign_in.check_password_attempts aspnetcore.identity.sign_in.sign_ins aspnetcore.identity.sign_in.sign_outs aspnetcore.identity.sign_in.two_factor_clients_remembered aspnetcore.identity.sign_in.two_factor_clients_forgotten
- Avoid cookie login redirects for known API endpoints
- เดิมมัน login / access denied URI
- ใหม่ คืน 401 / 403 แทน
ถ้าอยากได้ พฤติกรรมเดิมต้องเติม Code
builder.Services.AddAuthentication()
.AddCookie(options =>
{
options.Events.OnRedirectToLogin = context =>
{
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
});📌 EFCore10 Left Right Join อ่านเจอมานานและ แปะไว้ก่อน และมีบางส่วนเขียนไว้ตอน Meetup รอบก่อนด้วย What's New in .NET 10 - Why .NET 10 is a game changer
📌 จริงๆมันมีอีกหลาย Feature นะลองดูได้จากใน Resource
Resource What's new in C# 14 / What's new in ASP.NET Core in .NET 10 / Sample Code
มี Live ด้วยนะ
- เช้า https://www.facebook.com/dotNETConfTH/videos/4201574920082298/
- บ่าย https://www.facebook.com/dotNETConfTH/videos/2111977742949812
Reference
- https://dotnetconfth.com/
- FB Group .NET Thailand
- Resource งาน .NET Conf 2025 11-13 https://github.com/dotnetConf/2025
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.








