首页 文章

如何在启动时初始化应用程序状态并从MVC 6中的控制器访问它?

提问于
浏览
4

假设我有一个名为 MySiteConfiguration 的类,其中我有一堆,你猜对了,配置数据 . 加载后,该数据在应用程序运行时的过程中不会发生变化 .

我的目标是在启动时构造此类的实例,并从我的控制器操作中访问它 . 我不想多次构建类,因为这不应该是必需的 .

例如,要在WebApi 2中执行此操作,我会:

  • 在我的应用程序启动方法中实例化该类 .

  • 将实例存储在HttpConfiguration.Properties上

  • 创建一个继承自 ApiControllerControllerBase 类 .

  • 覆盖 ControllerBase 类中的 Initialize(HttpControllerContext) 方法 . 此覆盖将从 HttpControllerContext.Configuration.Properties 读取配置实例,并将其分配给 ControllerBase 中的属性/字段 .

需要访问配置实例的任何控制器都将继承 ControllerBase 并引用基本属性 . 还不错......

话虽如此,从我所知道的,这种模式在新框架中不起作用 . 在MVC 6的新 Controller 类中没有覆盖初始化方法 . 我也不熟悉新的Startup.cs模式和中间件,可以知道从哪里开始解决这个问题 .

谢谢 .

2 回答

  • 3

    使用依赖注入 . 注册包含数据的单例服务,然后在控制器上使用构造函数注入来获取服务实例 .

    首先,定义一个服务 . 服务可以是任何类或接口 .

    public class MyConfigService {
        // declare some properties/methods/whatever on here
    }
    

    在你的 Startup.cs 做这样的事情:

    services.AddSingleton<MyConfigService>();
    

    (请注意, AddSingleton 还有其他重载,具体取决于您的方案 . )

    然后在每个控制器中使用它:

    public MyController : Controller {
        public MyController(MyConfigService myService) {
            // do something with the service (read some data from it, store it in a private field/property, etc.
        }
    }
    
  • -2

    如何使用应用程序状态来存储配置数据?

    protected void Application_Start()
    {
        Application["MySiteConfiguration"] = new MySiteConfiguration();
    }
    

    然后,您可以从控制器内部访问配置数据 .

    public ActionResult Index()
    {
        var config = HttpContext.Application["MySiteConfiguration"] as MySiteConfiguration;
    }
    

相关问题