asp.net webapi 登入資訊放在類中 & 單例模式和工廠模式
(求回答在評論區)前端傳Token上來 然後在filter中查詢使用者資訊 是把使用者資訊放在一個類中,然後全域性都在使用嗎?
比如兩個人同時登入請求 使用者資訊類會覆蓋嗎 還是各用各的 ?
如果是各用各的 原理是什麼呢?
個人理解 就是類 每個使用者使用都是New了一遍 所以多人同時賦值類的時候都是New了一遍 各用各的 除了全域性靜態變數
你的c#程式碼都是在服務端執行,所以你說查出資料放到物件,也是可以的,但是這個物件的生命週期就在請求範圍內,出了這個請求生命週期就結束了,如果是靜態的話,就相當於駐留在服務端記憶體
web端每個請求都可以看成一個執行緒
每一個請求都是獨立的,誰呼叫,那一刻就是誰的值
原來的asp.net就是在baseController賦值使用者的資訊
然後每進一個action就賦值到基類中
Service中繼承基類 就直接可以獲取使用者的資訊了
asp.net Core有socpe生命週期 Autofac的生命週期是一樣的
注入這個生命週期就能在一個請求裡共享資料 比如這條可以共享順便說一下單例模式和工廠模式
dbcontext最好不要單例和靜態,這樣會出問題,尤其有statustrack的情況下記憶體大可以字典存起來 相當於全域性靜態變量了單例模式定義:確保一個類僅僅能產生一個例項,並且提供一個全域性訪問點來獲取該例項。單例模式就是建立一個特殊的類,這個類只能有一個例項的物件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class danli { static void Main(string[] args) { sing Instance = sing.GetInstance(); sing Instance2 = sing.GetInstance(); Person.Change(); Console.WriteLine(Instance2.i); Console.ReadKey(); } }public class Person { public static void Change() { sing Instance = sing.GetInstance(); Instance.i = 10; } } //建立一個單例特殊類 class sing { public int i = 1; //private sing() { } private static sing _Instance = null;//定義一個單例的例項 public static sing GetInstance()//獲取一個物件 { if (_Instance == null) _Instance = new sing(); return _Instance; } } }
最初的時候呼叫特殊類並且設定i=1,物件例項化後Instance.i=1,經過Change方法之後設定Instance.i=10;
輸出Instance2.i結果是10.
若非單例情況下,Instance.i的值應該是不確定的,從這也就可以說明,單例模式就是建立一個特殊的類,這個類只能有一個例項的物件,實際上Instance2=return Instance。
下面來說一下什麼是工廠模式:
工廠模式 :是我們最常用的例項化物件模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程式系統可以說是隨處可見。因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A() 工廠模式也是用來建立例項物件的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { //電腦抽象類 public abstract class Computer { public abstract void print(); } public class Lenovo:Computer { public override void print() { Console.WriteLine("This is a Lenovo Computer"); } } public class AUSU:Computer { public override void print() { Console.WriteLine("This is a AUSU Computer"); } } //選擇例項化物件的型別 public class Make { public static Computer Create(string Type) { Computer com = null; if(Type=="聯想") { com = new Lenovo(); } else if(Type=="華碩") { com = new AUSU(); } return com; } } class danli { static void Main(string[] args) { //運用工廠模式例項化物件 Computer com = Make.Create("聯想"); com.print(); Console.ReadKey(); } } }
這個程式碼是先定義了一個電腦的抽象類,然後通過選擇所要例項化出來的電腦的型別來製作方法Create;這個製作方法就相當與一個工廠,這個工廠只能加工聯想和華碩的電腦,當然我們也可以“擴大”工廠的生產型別,從而生產其他型別的電腦,但是這種方法顯然有一個弊端,就是當這個工廠壞掉之後,所有在這個工廠里加工的電腦都是不能在加工了,然後解決這個問題呢?
這就需要來抽象化工廠了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { //電腦抽象類 public abstract class Computer { public abstract void print(); } public class Lenovo:Computer { public override void print() { Console.WriteLine("This is a Lenovo Computer"); } } public class AUSU:Computer { public override void print() { Console.WriteLine("This is a AUSU Computer"); } } //工廠抽象 public abstract class Creater { public abstract Computer CreateComputer(); } //聯想工廠抽象 public class CreaterLenovo :Creater { public override Computer CreateComputer() { return new Lenovo(); } } //華碩工廠抽象 public class CreaterAUSU:Creater { public override Computer CreateComputer() { return new AUSU(); } } //public class Make //{ // public static Computer Create(string Type) // { // Computer com = null; // if(Type=="聯想") // { // com = new Lenovo(); // } // else if(Type=="華碩") // { // com = new AUSU(); // } // return com; // } //} class danli { static void Main(string[] args) { //利用工廠模式例項化物件 Creater cr = new CreaterAUSU();//例項化華碩工廠 Computer com = cr.CreateComputer();//在聯想工廠裡面例項化華碩電腦這個例項 com.print(); Console.ReadKey(); } } }
抽象化工廠其實和抽象化電腦的思路是一樣的,程式碼也是很簡單的,很容易看明白