java调用asp.net webapi_asp.net webapi 登录信息放在类中 & 单例模式和工厂模式

(求回答在评论区)前端传Token上来 然后在filter中查询用户信息   是把用户信息放在一个类中,然后全局都在使用吗?

比如两个人同时登录请求 用户信息类会覆盖吗 还是各用各的 ?

如果是各用各的 原理是什么呢?

个人理解  就是类 每个用户使用都是New了一遍 所以多人同时赋值类的时候都是New了一遍 各用各的  除了全局静态变量

你的c#代码都是在服务端运行,所以你说查出数据放到对象,也是可以的,但是这个对象的生命周期就在请求范围内,出了这个请求生命周期就结束了,如果是静态的话,就相当于驻留在服务端内存

web端每个请求都可以看成一个线程

每一个请求都是独立的,谁调用,那一刻就是谁的值

原来的asp.net就是在baseController赋值用户的信息

然后每进一个action就赋值到基类中

Service中继承基类 就直接可以获取用户的信息了

asp.net Core 有socpe生命周期 Autofac的生命周期是一样的

注入这个生命周期就能在一个请求里共享数据 比如这条可以共享

顺便说一下 单例模式和工厂模式

dbcontext最好不要单例和静态,这样会出问题,尤其有status track的情况下  内存大可以字典存起来

相当于全局静态变量了

单例模式定义:确保一个类仅仅能产生一个实例,并且提供一个全局访问点来获取该实例。 单例模式就是创建一个特殊的类,这个类只能有一个实例的对象

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp1

{classdanli

{static void Main(string[] args)

{

sing Instance=sing.GetInstance();

sing Instance2=sing.GetInstance();

Person.Change();

Console.WriteLine(Instance2.i);

Console.ReadKey();

}

}public classPerson

{public static voidChange()

{

sing Instance=sing.GetInstance();

Instance.i= 10;

}

}//建立一个单例特殊类

classsing

{public int i = 1;//private sing() { }

private static sing _Instance = null;//定义一个单例的实例

public static sing GetInstance()//获取一个对象

{if (_Instance == null)

_Instance= newsing();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时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp1

{//电脑抽象类

public abstract classComputer

{public abstract voidprint();

}public classLenovo:Computer

{public override voidprint()

{

Console.WriteLine("This is a Lenovo Computer");

}

}public classAUSU:Computer

{public override voidprint()

{

Console.WriteLine("This is a AUSU Computer");

}

}//选择实例化对象的类型

public classMake

{public static Computer Create(stringType)

{

Computer com= null;if(Type=="联想")

{

com= newLenovo();

}else if(Type=="华硕")

{

com= newAUSU();

}returncom;

}

}classdanli

{static void Main(string[] args)

{//运用工厂模式实例化对象

Computer com = Make.Create("联想");

com.print();

Console.ReadKey();

}

}

}

这个代码是先定义了一个电脑的抽象类,然后通过选择所要实例化出来的电脑的类型来制作方法Create;这个制作方法就相当与一个工厂,这个工厂只能加工联想和华硕的电脑,当然我们也可以“扩大”工厂的生产类型,从而生产其他类型的电脑,但是这种方法显然有一个弊端,就是当这个工厂坏掉之后,所有在这个工厂里加工的电脑都是不能在加工了,然后解决这个问题呢?

这就需要来抽象化工厂了

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp1

{//电脑抽象类

public abstract classComputer

{public abstract voidprint();

}public classLenovo:Computer

{public override voidprint()

{

Console.WriteLine("This is a Lenovo Computer");

}

}public classAUSU:Computer

{public override voidprint()

{

Console.WriteLine("This is a AUSU Computer");

}

}//工厂抽象

public abstract classCreater

{public abstractComputer CreateComputer();

}//联想工厂抽象

public classCreaterLenovo :Creater

{public overrideComputer CreateComputer()

{return newLenovo();

}

}//华硕工厂抽象

public classCreaterAUSU:Creater

{public overrideComputer CreateComputer()

{return newAUSU();

}

}//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;//}//}

classdanli

{static void Main(string[] args)

{//利用工厂模式实例化对象

Creater cr = new CreaterAUSU();//实例化华硕工厂

Computer com = cr.CreateComputer();//在联想工厂里面实例化华硕电脑这个实例

com.print();

Console.ReadKey();

}

}

}

抽象化工厂其实和抽象化电脑的思路是一样的,代码也是很简单的,很容易看明白

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值