在 .NET Framework 中,無論是 App.Config
或 Web.Config
,均有保留 <configSections>
讓我們可以自訂設定區塊(ConfigurationSection
),由於曾經看過有一些 Library 把設定值放在節點之中,像這樣:
等到要自己弄的時候才發現,似乎沒有那麼簡單,網路上搜尋到的有關於自訂 ConfigurationSection 的文章,大都沒有提到這一塊。
在 .NET Framework 中,無論是 App.Config
或 Web.Config
,均有保留 <configSections>
讓我們可以自訂設定區塊(ConfigurationSection
),由於曾經看過有一些 Library 把設定值放在節點之中,像這樣:
等到要自己弄的時候才發現,似乎沒有那麼簡單,網路上搜尋到的有關於自訂 ConfigurationSection 的文章,大都沒有提到這一塊。
利用 Azure SQL PM team 所製作的檢測語法,找出 Azure SQL Database 可改善之處
Windows Forms 的 DataGridView 開啟編輯資料之後,我們就可以在畫面上直接對資料進行修改,預設的統一操作行為是修改完資料之後,按下 Enter 鍵或是離開該儲存格,資料就會更新到綁定的 DataSource 上,就像下面這樣:
但是呢,使用者會希望能在修改之後立即更新到 DataSource,不要再多敲 Enter 鍵或離開儲存格的動作,尤其是 ComboBox,我們來看一下怎麼弄?
利用 Microsoft Connector for Oracle 輕鬆連接 Oracle 資料庫
如果我們的 Data Source 是非同步更新的話,那麼我們就很容易收到下面的錯誤訊息。
跨執行緒作業無效: 存取控制項 'xxx' 時所使用的執行緒與建立控制項的執行緒不同。(Cross-thread operation not valid: Control 'xxx' accessed from a thread other than the thread it was created on.)
一般遇到這個情況,我們通常就是判斷 Control.InvokeRequired
屬性,然後改用 Control.Invoke()
或 Control.BeginInvoke()
方法來修改控制項的屬性,如果是在有資料綁定的情況呢?怎麼解決這個跨執行緒的問題?
習慣寫 ControlTemplate 的朋友應該都滿習於使用 TemplateBinding,但是 TemplateBinding 有某些限制導致無法使用在 Trigger 中,本篇用個簡單的範例來說明如何解決類似的問題。
在 Windows Forms 當中,只要是繼承自 Control 的控制項,都有實作 IBindableComponent 這個介面,都具有資料綁定的能力,但是有一些控制項就沒有,例如:ToolStripStatusLabel,不過也不是不能做資料綁定,加給它就好了。
日前在Tunning一句語法時,在SSMS的視窗下撰寫TSQL測試。當時發現我用變數當參數來查跟直接用數字來當參數查時會跑不同的執行計畫,Code的範例如下
要在一支既有的 Windows Forms(Windows 視窗程式)上,增加一個 TextBox 控制項,它有一個特殊的需求,就是在 TextBox 修改的文字不能與綁定的 DataMember 連動,簡單來說,就是做單向綁定(One-Way Binding)
。
使用 Cytoscape.js 實現廠房機台地圖繪製功能
本文實作 IHostedService 介面將 Quartz.Net 排程作業託管於 ASP.NET Core 網站中,並以 SignalR 實現 real-time 排程狀態管理 Dashboard 頁面
以往用 .NET Framework 開發的時候,都是用 TopShelf 來建置 Windows 服務,現在 .NET Core 弄了一個叫 .NET Generic Host 的東西,我們可以直接將服務透過它來 Host 成背景服務,而且它是跨平台的,不只可以部署在 Windows 上,Linux 上也行得通,ASP.NET Core 應用程式就是用它來讓服務可以長時間執行。
當我們建立一個 ASP.NET Core Web 應用程式專案的時候,預設在 Startup.cs
中就會呼叫 UseStaticFiles()
使用 StaticFileMiddleware,讓專案中的靜態檔案可以透過 HTTP 被存取到,現在我想要將這些靜態檔案 Cache 在 CDN 上,我需要在 Response Headers 裡面加上 Cache-Control: public, max-age=n
,我們來看要怎麼做?
之前其實就有想寫這一篇,但是因為很忙而擱著,今天看到了某些網路文章,才讓我起意把這篇補起來。早期我寫了一系列關於架構師先決條件的文章 "邁向架構師的暖身運動",簡單說明了怎麼由架構的角度去思考系統設計的方略,今天就用這篇文章將它做個總結吧 (謎之音:其實是你自己懶吧)。
Source Generator 是微軟於 .NET 5 所推出的新功能,
它允許我們從原始碼編譯的結果中取得所需的 meta 資訊,
進而根據這些資訊去組出額外的程式碼,並加至最後的編譯結果中。
而當原始碼數量過於龐大時,將篩選 Syntax 的邏輯寫在 Generator 內就會稍顯雜亂。
這時可以使用 SyntaxReceiver 幫助我們快速篩選所需的 Syntax 資訊!
這是無意中發現的一個語法,它的使用情境是這樣的,如果我們有一個型別是自訂類別的屬性,並且在建構式中有針對該屬性做初始化,在初始化後想要接著修改該屬性中裡面的屬性值,C# 的 Object Initializer 有一個簡便的語法 Xyz = { ... }
。
Heroku 是一個雲端服務平台,你可以把程式碼放上去,他可以依照你寫好的步驟建置成你想要的樣子
這一篇以 Discord bot 為示範
上一篇提到我們可以把 ASP.NET Core Feature Flags 的設定,儲存在 Azure App Configuration(應用程式組態)裡面,現在再進階一點,我們可以實作 IFeatureDefinitionProvider 建立一個 Feature Definition Provider,讓 Feature Flags 的設定可以儲存在我們想要的地方。
開發時一定會用到環境變數,確保 config 可以快速被切換、程式碼不要包含機敏資料等等目的,所以就會透過 config 檔的方式來讀取各種機密資料
而 Node.js 可以透過 dotenv 來達成這件事
筆記一下如何透過 Node.js 建置 Discord 機器人