如何使用中间件代替控制器初始化?

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() 方法?

Joe*_*kes 0

为什么不把它变成一个惰性控制器属性呢?

这很好,因为现在如果您不使用缓存,您就无法将用户从缓存中取出。

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请求管道

这就是请求管道在 mvc 中的工作方式(并且仍然在 aspnetCore 中工作)。 在此输入图像描述 图片来自dotnetCurry

在管道中较早访问用户

如果您想访问请求管道中较早的用户,我建议:

  • @dabouls 答案:添加中间件以将其注入 Http.Items
  • 创建一个 UserRepository 类并将其注册到 Ioc 容器中的请求范围。+ 使用HttpContextAccessor,但访问 HttpContext.Current 通常是一种反模式,不鼓励使用。