簡單介紹di注入
c#di 注入有三種生命週期,Transient,Scoped,Singleton,如下表所述 生命週期 描述 使用時機 Transient 每次注入都會建立一個新的實例。 適用於輕量級且無狀態的服務。 Scoped 從 request 進來到回傳 response 期間每次注入都是共用相同得實例 適用於需要在單一請求中共用狀態的服務,例如資料庫上下文。 Singleton 當應用程式服務啟動時,只會建立一個實例,直到該服務關閉 適用於需要在應用程式中共用狀態的服務。 個別的使用時機是什麼時候? Transient:適用於輕量級且無狀態的服務,例如寄信服務。 Scoped:適用於需要在單一請求中共用狀態的服務,例如資料庫上下文。一般使用三層架構時,Controller、Service 和 Repository 通常會使用 Scoped。 Singleton:適用於需要在應用程式中共用狀態的服務,例如配置設定或日誌記錄。連線字串也應該使用 Singleton 生命週期,確保在應用程式的整個生命週期內是唯一且一致的。 為什麼要用 DI 注入 依賴注入(Dependency Injection, DI)是一種設計模式,用於實現對象之間的鬆耦合。使用 DI 有以下幾個好處: 解耦:DI 使得類之間的依賴關係變得明確,減少了類之間的耦合度。這樣可以更容易地替換和測試各個組件。 可測試性:通過 DI,可以輕鬆地將依賴項替換為模擬對象(Mock),從而進行單元測試。這使得測試變得更加簡單和可靠。 可維護性:DI 使得代碼結構更加清晰,依賴關係更加明確,從而提高了代碼的可維護性。當需要修改某個依賴項時,只需修改注入的配置,而不需要修改使用該依賴項的代碼。 可重用性:通過 DI,可以將通用的依賴項提取出來,實現代碼的重用。這樣可以減少重複代碼,提高開發效率。 靈活性:DI 允許在運行時動態地注入依賴項,從而提高了應用程式的靈活性和可配置性。
請簡單介紹什麼是索引
以 mssql 為例子,索引主要區分叢集索引與非叢集索引,我們可以用一本書來做範例,這本書可以當作是一張資料表,目錄就可以當作是一個叢集索引,附錄就可以當作是一個非叢集索引。 叢集索引 叢集索引會將資料依照索引排序與儲存,因為資料只能有一種排序,所以每張表只能有一個叢集索引。 當資料表有包含叢集索引時資料才會以排序方式儲存,如果沒有則會存在未排序的結構中,又稱為堆積 非叢集索引 非叢集索引的排列順序不會影響實際資料的排列方式,所以每張表可以有多個非叢集索引 非叢集索引會有一個指標指向資料列,此指標稱為資料定位器,若該資料表是堆積(沒有叢集索引)則資料定位器會指向資料列,若是叢集資料表,則資料定位器會指向叢集索引鍵。 為什麼叢集索引比非叢集索引快? 因為非叢集所以是指向記憶體地址,而非實際存放的位置 什麼是 b-tree,如果從 1-10 怎麼排列?什麼又是 b+ tree? 以後再補 有使用過複合索引嗎?幫我簡單介紹 是將多個 key 值組合成索引鍵,例如(A+B+C)是一個複合索引,但需要注意的是最源頭的 A 一定要在查詢條件內才會使用的該索引 使用複合索引 A,A+B,A+B+C,A+C 未使用複合索引 B,B+C,C 什麼是含有資料行的非叢集索引? 在建立非叢集索引時,將所需要的欄位放入非叢集索引內,例如 A 是非叢集索引將 B,C 包含在 A 之中,則當查詢條件是 A 的時候,所要取得的資料欄位如果只有 A,B,C 可以增加效率 如果查詢條件多了一個 D 會需要額外的成本將 D 資料取出。 參考 SQL Server 及 Azure SQL 索引架構與設計指南 叢集與非叢集索引 索引是什麼 ? 為什麼加了索引查詢會變快|| What is indexing ? How the indexing makes SELECT queries faster?
dotnet ef Error
當使用者使用 dotnet cli 輸入 ef core 指令時會遇到下列錯誤訊息時,肯定會很納悶為什麼會錯誤。 dotnet ef 指令需先透過dotnet tool install –global dotnet-ef進行全域安裝。 Your startup project 'MicroRabbit.Banking.Api' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again. 找到執行專案的 csproj 檔案,將 Microsoft.EntityFrameworkCore.Design 的 PrivateAssets 註解掉,再重新執行 dotnet ef migrations add 就可以執行了 <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.8"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <!-- <PrivateAssets>all</PrivateAssets> --> </PackageReference> 參考 stackoverflow
Opencc Memory Leak
近期專案上有個需求,需要使用opencc來將接收到的資料將簡體轉繁體,參考了will保哥與黑暗執行緒的範例,其中保哥的文章指出有做防止記憶體洩漏的調整,但上線後發現一樣有記憶體洩漏的問題,最後找到的解決方案是,應該要使用opencc的函式做記憶體釋放,而非使用C#的函式。 調整前 using System.Runtime.InteropServices; using System.Text; public static class OpenCCHelper { [DllImport(@"C:\Tools\opencc\bin\opencc.dll", EntryPoint = "opencc_open")] private static extern IntPtr opencc_open(string configFileName); [DllImport(@"C:\Tools\opencc\bin\opencc.dll", EntryPoint = "opencc_convert_utf8")] private static extern IntPtr opencc_convert_utf8(IntPtr opencc, IntPtr input, long length); public static string ConvertFromSimplifiedToTraditional(this string text, string config = "s2t") { return OpenCC(text, config: config); } public static string ConvertFromSimplifiedToTraditionalTaiwan(this string text, string config = "s2twp") { return OpenCC(text, config: config); } public static string ConvertFromTraditionalTaiwanToSimplified(this string text, string config = "tw2sp") { return OpenCC(text, config: config); } public static string ConvertFromTraditionalToSimplified(this string text, string config = "t2s") { return OpenCC(text, config: config); } public static string OpenCC(this string text, string config) { var configFile = $"C:\\Tools\\OpenCC\\share\\opencc\\{config}....
Dockerslow
dotnet 6 部署到docker忽然變很慢 最近在公司將dotnet 6 用docker-compose部署到測試機時忽然要等3-5分鐘,最後查證是因為我們在linux環境上有做mount遠端磁碟造成部署時間過長 掛載的磁碟機沒有做資料夾分類所有檔案都在一個資料夾底下,在根目錄就有破百萬的檔案,導致container透過volume連到實體路徑時會讀取過久
安裝到手機
如何直接安裝到ios裝置 flutter build ios flutter install 選擇要安裝到哪個裝置
2024年度目標
2024年度目標 學會使用copilot,增加coding效率 3月前使用flutter開發記帳軟體並且上架 7月前TOEIC金色證書 開始錄製廣播
Dapper PostgreSQL Error
問題 當使用dapper呼叫postgresql時後,需要在in裡面查詢一批陣列會遇到下方的錯誤訊息 var Ids = [1,2,3,4]; DynamicParameters parameters = new(); parameters.Add("Ids", Ids); var strSQL = ""; strSQL +="select * from Users where id in @Ids;" await dapper.QueryAsync(strSQL,parameters); 42601: syntax error at or near “$1”\r\n\r\nPOSITION: 81 解法 改語法為any就可以解決這個問題。 var Ids = [1,2,3,4]; DynamicParameters parameters = new(); parameters.Add("Ids", Ids); var strSQL = ""; strSQL +="select * from Users where id = any(@Ids);" await dapper.QueryAsync(strSQL,parameters);
Three Tree
三棵樹 flutter共有三個核心 widget tree 在flutter很常看到一層包一層,MaterialApp、Scaffold這類組件都是widget tree,我們通常只會對到這層。 element tree 會將資料儲存在記憶體,並決定要不要重新繪製UI render tree 是由element tree控制,當element tree決定有必要修改,就會透過render tree進行UI修改
如何固定設備方向
如何鎖定裝置的方向 先到main.dart檔案找到最初的進入點main()要執行runApp時,先執行 WidgetsFlutterBinding.ensureInitialized(); 確定每次執行都要初始化 SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]) 選擇我們接受的方向 所在的函示庫記得引入 import ‘package:flutter/services.dart’; void main() { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]).then((value) => { runApp(MaterialApp( home: const Expenses(), )) }); }