1. 程式人生 > 實用技巧 >asp.net webapi 登入資訊放在類中 & 單例模式和工廠模式

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();
        }
    }


}

抽象化工廠其實和抽象化電腦的思路是一樣的,程式碼也是很簡單的,很容易看明白