如何为ASP.NET Core应用程序设置上下文

时间:2016-12-06 15:22:46

标签: asp.net-mvc asp.net-core

在我们的旧ASP.NET应用程序中,我们有“Context”的概念,它是网页可能需要的任何数据。因此,Context可以包含有关网站本身的数据,它可以包含最终用途的详细信息,

在请求生命周期开始期间,HttpModule加载了完整的Context。 Context的每个部分都保存在Cache或Current Items Collection中(取决于我们想要保存信息的时间长度)。当需要时,Page会调用Context。

所以,我想知道如何最好地在.NET Core中实现类似的功能。

如果我们采用最终用户数据的简单例子......

我的想法是这个数据可以保存在一个名为“EndUser”的对象中。 Controller的构造函数可以有IEndUser类型的参数,我们可以使用内置的依赖注入在Startup.cs中添加一个这样的实例:

services.AddScoped<IEndUser, EndUser>();

这当然会添加一个vanilla EndUser对象,但是我希望我可以使用MiddleWare类来首先设置它的所有属性.....因为我正在使用“AddScoped”然后我希望Controller的构造函数会接收MiddleWare刚刚填充的相同实例。但是,我很快就意识到这些是不同的对象(事后很明显)并且这是错误的方法。

那么:什么是正确的方法?请记住以下内容:

  • 使用旧的HttpModule,可以加载Site对象(在概念上类似于EndUser对象)(从DB加载数据),在HttpModule中检查site.OnMaintenance属性是否为true,在这种情况下执行重定向无论当前请求如何,在执行之前已进入所请求的控制器,到适当的页面。

总而言之,我想:

  1. 我的MiddleWare创建一个类并填充其属性(来自数据库)
  2. 我的MiddleWare对该类的属性执行测试,可能会执行重定向。
  3. 如果没有重定向,则将该实例注入我的Controller的构造函数中。

1 个答案:

答案 0 :(得分:1)

ASP.NET Core的架构不同,正如您所注意到的那样。有一个上下文对象(接近&#34;上帝对象&#34;)状态在ASP.NET中很常见,但在ASP.NET Core中不是正确的方法。

我不太了解您的应用程序的结构,我建议如下:

  1. 创建添加到DI容器的MaintenanceNoticeService。此服务将封装检查数据库OnMaintenance标志所需的所有逻辑。

  2. 在管道中创建一个位于MVC上方的简单中间件,该管道使用该服务来检查您网站的状态。如有必要,您可以在此重定向。

  3. 为访问用户数据等内容创建单独的服务。这些可以根据需要注入控制器。

  4. 目标应该是将事情分解为小的逻辑部分。具有处理站点维护检查的Context对象以及注入控制器以提供用户数据的Context对象是混合问题。