Iva*_*ono 5 c# asp.net asp.net-core
我正在将我的 ASP.Net 应用程序迁移到 ASP.Net 核心,我拥有的一项功能是我的所有控制器都继承自我所做的基本控制器:
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
string token = controllerContext.Request.Properties["token"] as string;
user = UserCache.Get(token);
//Called by derived controllers
//to set their repository user
SetInfo();
}
Run Code Online (Sandbox Code Playgroud)
我需要将上面的代码移动到中间件吗?中间件是否允许我设置调用控制器的 SetInfo() 方法?
为什么不把它变成一个惰性控制器属性呢?
这很好,因为现在如果您不使用缓存,您就无法将用户从缓存中取出。
private User _user;
public User user { get { return _user ?? (_user = UserCache.Get(this.Request.Properties["token"])); } }
Run Code Online (Sandbox Code Playgroud)
关于SetInfo()。
我建议将此代码移至构造函数或其他位置(取决于此函数的内容)。控制器是在Router完成其工作后创建的。由IControllerFactory. 您可以扩展DefaultControllerFactory。该类负责创建控制器实例。(确保在 中注册它IServiceCollection,否则你的类不是被解析的类。
对于您的情况,我认为最好在这里重新考虑您的架构,并专注于尽可能无状态,而不是使用下面描述的反模式之一。
这就是请求管道在 mvc 中的工作方式(并且仍然在 aspnetCore 中工作)。
图片来自dotnetCurry
如果您想访问请求管道中较早的用户,我建议: