C#程式設計

C# Web API 常見問題:public static變數

先前我們公司的產品在寫的時候我有一部分Code Review沒注意到,發現有底下的人這樣寫:

public static string UserID=””;

雖然沒看到是我的疏忽,但導致程式得翻新,為什麼呢?

公開靜態變數範圍

這樣的話全伺服器的或者全部使用同一個容器的使用者都會共用一個UserID。因為我們使用的是Google Cloud Run,容器只開1 vCPU,同時間兩個人使用會開2個容器,所以這個地雷沒爆炸。

如果是架設在IIS等Web Server上,同時有兩個人輪流進去的話,UserID會一下是A User一下是B User。如果沒有覆蓋好,B User會變成被當A User看。

這個要怎樣處理

大致上處理方法有很多種,最常見應該是使用相依性注入,在program.cs裡面

services.AddScoped<MyData>();

MyData是要記錄的參數的物件。

一個相依性物件,然後在Middleware把這個相依性物件MyData設定值,然後注入Controller一路傳下去到Domain、Manager這兩層,假設是使用我寫的Model->Manager->Domain->Controller四層的架構。

這種方法可以做什麼

這種方法除了可以每個使用者存一個MyData以外,還可以實作ILogger,也就是自定義的Logger。

現在有很多的Logger可以做免費的使用,但自定義的Logger可以把Logger、Trace…到要給用戶看的Syslog,都併在一起。

輕量化是最完美的,除非東西複雜到用現成的比較好,不然自己寫是可以節省最多資源也最彈性。

如果也是使用public static ILogger myLogger = new ILogger();

這樣保證紀錄混亂掉,會紀錄同時間使用的所有使用者的紀錄。

如果用相依性注入的方法在Scoped範圍上的話,就不會有這個問題。

結論

做Code Review的人很重要的是頭腦要夠清楚且夠細心,當時只是一個分心就導致系統得部分重寫,過年假期得加班了。

希望這個可以讓有些人不會犯下一樣的錯。

What's your reaction?

Excited
0
Happy
0
In Love
0
Not Sure
0
Silly
0

Comments are closed.