[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"note-\u002Fnotes\u002Fsync\u002Fcsharp-resoucehub-program-cs":3},{"id":4,"title":5,"body":6,"category":365,"date":366,"description":367,"draft":368,"extension":369,"meta":370,"navigation":38,"path":371,"seo":372,"sourcePath":373,"stem":374,"tags":375,"__hash__":378},"notes\u002Fnotes\u002Fsync\u002Fcsharp-開發-resoucehub-program-cs.md","Program.cs",{"type":7,"value":8,"toc":357},"minimark",[9,150,161,165,175,224,229,240,246,251,267,271,275,299,305,310,325,353],[10,11,16],"pre",{"className":12,"code":13,"language":14,"meta":15,"style":15},"language-csharp shiki shiki-themes github-light github-dark","using Microsoft.EntityFrameworkCore;\nusing ResourceHub.Data;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddControllers();\nbuilder.Services.AddDbContext\u003CAppDbContext>(options =>\n    options.UseInMemoryDatabase(\"ResourceListDb\"));\nbuilder.Services.AddOpenApi();\n\nvar app = builder.Build();\n\n\u002F\u002F Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi();\n}\n\napp.UseHttpsRedirection();\napp.UseAuthorization();\napp.MapControllers();\napp.Run();\n","csharp","",[17,18,19,27,33,40,46,51,57,63,69,75,80,86,91,97,103,109,115,121,126,132,138,144],"code",{"__ignoreMap":15},[20,21,24],"span",{"class":22,"line":23},"line",1,[20,25,26],{},"using Microsoft.EntityFrameworkCore;\n",[20,28,30],{"class":22,"line":29},2,[20,31,32],{},"using ResourceHub.Data;\n",[20,34,36],{"class":22,"line":35},3,[20,37,39],{"emptyLinePlaceholder":38},true,"\n",[20,41,43],{"class":22,"line":42},4,[20,44,45],{},"var builder = WebApplication.CreateBuilder(args);\n",[20,47,49],{"class":22,"line":48},5,[20,50,39],{"emptyLinePlaceholder":38},[20,52,54],{"class":22,"line":53},6,[20,55,56],{},"builder.Services.AddControllers();\n",[20,58,60],{"class":22,"line":59},7,[20,61,62],{},"builder.Services.AddDbContext\u003CAppDbContext>(options =>\n",[20,64,66],{"class":22,"line":65},8,[20,67,68],{},"    options.UseInMemoryDatabase(\"ResourceListDb\"));\n",[20,70,72],{"class":22,"line":71},9,[20,73,74],{},"builder.Services.AddOpenApi();\n",[20,76,78],{"class":22,"line":77},10,[20,79,39],{"emptyLinePlaceholder":38},[20,81,83],{"class":22,"line":82},11,[20,84,85],{},"var app = builder.Build();\n",[20,87,89],{"class":22,"line":88},12,[20,90,39],{"emptyLinePlaceholder":38},[20,92,94],{"class":22,"line":93},13,[20,95,96],{},"\u002F\u002F Configure the HTTP request pipeline.\n",[20,98,100],{"class":22,"line":99},14,[20,101,102],{},"if (app.Environment.IsDevelopment())\n",[20,104,106],{"class":22,"line":105},15,[20,107,108],{},"{\n",[20,110,112],{"class":22,"line":111},16,[20,113,114],{},"    app.MapOpenApi();\n",[20,116,118],{"class":22,"line":117},17,[20,119,120],{},"}\n",[20,122,124],{"class":22,"line":123},18,[20,125,39],{"emptyLinePlaceholder":38},[20,127,129],{"class":22,"line":128},19,[20,130,131],{},"app.UseHttpsRedirection();\n",[20,133,135],{"class":22,"line":134},20,[20,136,137],{},"app.UseAuthorization();\n",[20,139,141],{"class":22,"line":140},21,[20,142,143],{},"app.MapControllers();\n",[20,145,147],{"class":22,"line":146},22,[20,148,149],{},"app.Run();\n",[151,152,154,157,158],"h3",{"id":153},"microsoftentityframeworkcore與resourcehubdata",[17,155,156],{},"Microsoft.EntityFrameworkCore","與",[17,159,160],{},"ResourceHub.Data",[151,162,164],{"id":163},"webapplicationcreatebuilderargs","`WebApplication.CreateBuilder(args);",[166,167,168],"blockquote",{},[169,170,171,174],"p",{},[17,172,173],{},"WebApplication.CreateBuilder(args)"," 就是整個 .NET 專案的「萬物本源」",[176,177,178,194,200,210],"ul",{},[179,180,181,185,186,189,190,193],"li",{},[182,183,184],"strong",{},"讀取環境變數與設定檔："," 它會自動去抓取 ",[17,187,188],{},"appsettings.json","（類似 Node.js 的 ",[17,191,192],{},".env","）裡面的設定。",[179,195,196,199],{},[182,197,198],{},"設定基礎 Log 系統："," 讓你在終端機可以看到那些黃黃綠綠的系統提示文字。",[179,201,202,205,206,209],{},[182,203,204],{},"建立依賴注入 (DI) 的大倉庫："," 也就是為後面的 ",[17,207,208],{},"builder.Services"," 準備好空間。",[179,211,212,215,216,219,220,223],{},[182,213,214],{},"接收外部參數："," 括號裡的 ",[17,217,218],{},"args"," 就是終端機下指令時傳進來的參數（例如 ",[17,221,222],{},"dotnet run --environment Production","），它會把這些參數吃進來。",[151,225,227],{"id":226},"builderservices",[17,228,208],{},[169,230,231,232,235,236,239],{},"在 ",[17,233,234],{},"builder.Build()"," 執行之前，所有開頭為 ",[17,237,238],{},"builder.Services.Add..."," 的程式碼，都屬於「註冊服務 (Service Registration)」階段。",[151,241,243],{"id":242},"builderservicesaddcontrollers",[17,244,245],{},"builder.Services.AddControllers();",[247,248,250],"h4",{"id":249},"_1-自動掃描並註冊所有的-controller","1. 自動掃描並註冊所有的 Controller",[176,252,253,256],{},[179,254,255],{},"當程式啟動執行到這一行時，系統會自動像雷達一樣掃描你整個專案",[179,257,258,259,262,263,266],{},"只要發現有任何類別繼承了 ",[17,260,261],{},"ControllerBase","（例如你剛剛寫的 ",[17,264,265],{},"ResourcesController","），就會把它註冊到系統的「依賴注入 (DI) 容器」裡，正式成為處理 HTTP 請求的合法窗口。你不需要像其他框架那樣，每寫一個 Controller 就手動去某個陣列裡加一筆。",[247,268,270],{"id":269},"_2-啟用自動資料轉換-model-binding","2. 啟用自動資料轉換 (Model Binding)",[247,272,274],{"id":273},"_3專注於-api-不渲染-html-畫面","3.專注於 API (不渲染 HTML 畫面)",[176,276,277,283,289],{},[179,278,279,282],{},[17,280,281],{},"AddControllersWithViews()","：這是給傳統 MVC 用的（後端要負責把資料塞進 HTML 模板裡吐給前端）。",[179,284,285,288],{},[17,286,287],{},"AddRazorPages()","：這是給另一種後端渲染網頁用的。",[179,290,291,294,295,298],{},[17,292,293],{},"AddControllers()","：這是",[182,296,297],{},"最輕量","的註冊方式。它明確告訴系統：「我這個專案是一個純粹的 Web API 後端，我只回傳 JSON 格式的資料，不處理任何 HTML 畫面。」",[151,300,302],{"id":301},"var-app-builderbuild",[17,303,304],{},"var app = builder.Build();",[166,306,307],{},[169,308,309],{},"這個才是真正的「成型」時刻。",[169,311,312,313,316,317,320,321,324],{},"當你把所有的 Controller、資料庫 (",[17,314,315],{},"AddDbContext",") 都丟進 ",[17,318,319],{},"builder"," 之後，一旦呼叫了 ",[17,322,323],{},".Build()","：",[176,326,327,330,337],{},[179,328,329],{},"這個大倉庫就會被「鎖死」。",[179,331,332,333,336],{},"系統會把剛才註冊的所有東西打包，真正實例化出一個可以處理 HTTP 請求的 Web 伺服器物件 (",[17,334,335],{},"app",")。",[179,338,339,342,343,345,346,349,350,352],{},[182,340,341],{},"注意："," 在 ",[17,344,323],{}," 執行之後，你就",[182,347,348],{},"再也不能","往 ",[17,351,208],{}," 裡面加新東西了。",[354,355,356],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":15,"searchDepth":29,"depth":29,"links":358},[359,361,362,363,364],{"id":153,"depth":35,"text":360},"Microsoft.EntityFrameworkCore與ResourceHub.Data",{"id":163,"depth":35,"text":164},{"id":226,"depth":35,"text":208},{"id":242,"depth":35,"text":245},{"id":301,"depth":35,"text":304},"backend","2026-08-10","using Microsoft.EntityFrameworkCore;",false,"md",{},"\u002Fnotes\u002Fsync\u002Fcsharp-resoucehub-program-cs",{"title":5,"description":367},"C#\u002F開發\u002FResouceHub\u002FProgram.cs.md","notes\u002Fsync\u002Fcsharp-開發-resoucehub-program-cs",[376,377],"C#","Practice","xsAhmLFcWbHOoykeWv7CaXPzrdCs0M2FHq8bWyjZpH0",1788767747499]