快轉到主要內容
  1. Tags/

Dotnet

2025


Aspire 13

·1 分鐘

一個專案的開始 #

開發專案時,通常會在本地端進行,並結合 Database 和 Cache 等服務。目前常見的做法是使用 Docker 啟動 Database 或 Cache container 來建立本地測試環境,而非直接連線到公司提供的測試環境。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
version: '3.9'

services:
  postgres:
    image: postgres:16
    container_name: my_postgres
    restart: always
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  pg_data: {}  

以上面的例子來說,你需要先有以下的知識:

2017


.Net Standard 筆記

·1 分鐘

簡單筆記 #

  • 標準的基礎程式庫 API 介面定義
  • 可以跨平台
  • 目前 .Net framework 4.6.1 支援 .Net Standard 2.0 (.Net Standard 1.x 僅有 .Net Code 1.x 支援)
  • .Net Standard 版本控制規則
    • 累加:較新的版本會包含較舊版本的 API
    • 不可變:版本提交後,該版本便已凍結
  • 自行根據 PCL (Portable Class Library),決定設定檔集合 (就是決定要用哪套實作的程式庫,看是要用 .Net framework 或是 .Net Core)

架構圖 #

網路介紹文章 #

Akka.Net 不錯用

·2 分鐘

真的使用之後,越來越覺得 Actor Model 是個好物,因為他本來就是拿來做平行運算用的。

建議可以先從以下的幾篇文章以及 Github 的範例開始

好處 #

我剛開始做的時候,其實是想到 Sequence Diagram。因為 Actor Model 的重點其實就是在訊息的傳遞與處理,只是在整體架構上有一個 ActorSystem 幫忙做處理

根據以下的圖片

一個 Actor 在建立之後,AkkaDotNet 會幫你建立整個 Actor 的基本行為。 包含一個 Mailbox、預設的狀態等,而且也預設了每個 Actor 都有可以有 Children Actors 所以,當你傳遞一個訊息給 Actor 的時候,其實不是直接呼叫 Actor 中處理訊息的方法,而是先進入 Mailbox,類似郵件的方式排隊處理。

當處理有問題的時候,你是可以在 Handle 方法中,直接拋出錯誤,讓 Actor 失敗。如此一來就會觸發上層 Actor 的 SupervisorStrategy。預設的 Strategy 可以參考 Fault Tolerance 文件

2015


在 .Net 專案使用 gulp build

·1 分鐘

一直以來,開發 .Net 專案,因為只能在 Windows 上使用 Visual Studio 開發
Build Project 的 Performance 總是我一個覺得很麻煩的事情

log4net Action Log 設定

·4 分鐘

我之前設定網站執行的 Action Log 的一個記錄,有些東西都是拼拼湊湊出來的,並不見得是最佳版本

log4net 設定檔

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="stdout" />
        <appender-ref ref="ActionLogRollingFile" />
    </root>
    <appender name="ActionLogRollingFile" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" value="action.log" />
        <appendToFile value="true" />
        <encoding value="utf-8" />
        <maxSizeRollBackups value="30" />
        <rollingStyle value="Date" />
        <datePattern value="'.'yyyy-MM-dd" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="(%date{HH:mm:ss,fff}) [%t] - %u %5property{Duration} %property{StatusCode} %6property{Method} %property{Uri} %m%n " />
        </layout>
        <filter type="log4net.Filter.LoggerMatchFilter">
            <acceptOnMatch value="true" />
            <LoggerToMatch value="Sample.Web.Filters.WebApiActionFilter" />
        </filter>

        <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
</log4net>

其中要注意的是

  • log4net.Filter.LoggerMatchFilter: 用來設定特定的 class 記錄才使用這個 Appender
    • acceptOnMatch: 這個設定有點像是 blacklist/whitelist,true 表示有 match 才是,相當於 whitelist
    • LoggerToMatch: 設定要篩選的類別名稱
  • log4net.Filter.DenyAllFilter: 篩選掉其他的 Log,不會在這個 Appender 裡面記錄