如何在 ASP.NET Core 中实现设置页面? 资源过滤器异常过滤器实施检测数据库

问题描述

我想为 Web 应用程序创建类似安装页面内容。例如,用户可以选择使用哪个数据库(Microsoft sql Server、Postgres 等)以便与数据库建立连接的页面

您对如何实现此类页面有任何想法吗?有没有这样的页面的项目?

解决方法

这是一个非常广泛的问题,高度依赖于您的应用程序。例如,你在哪里存储你的连接字符串?您何时何地首次访问它?不过,我可以提供有关如何处理此问题的广泛概述,以及一些有助于您入门的参考资料。

基本步骤

  1. 确定缺少配置数据
  2. 重定向到设置页面
  3. 从用户那里收集丢失的配置数据
  4. 将丢失的配置数据保存到您的配置存储区
  5. 重定向回原来的

解决所有这些问题比 Stack Overflow 上的任何一个答案都要复杂,但我可以提供一些有助于解决最可能遇到的绊脚石的指针。

拦截请求

第一个要求是检测配置数据是否丢失并重定向到设置页面。这通常是通过某种类型的 ASP.NET Core MiddlewareFilter 完成的。中间件更灵活一些,因为它们可以更早发生并涵盖更广泛的请求,而过滤器更容易编写,因为它们可以轻松访问有关请求的更多上下文信息。

资源过滤器

一种常见的方法是创建一个 ASP.NET Core Resource Filter 或检查是否存在关键配置资源 - 例如连接字符串 - 如果它们不存在,则将用户重定向到设置页面. ASP.NET Core Middleware 也可以采用类似的方法。

异常过滤器

另一种方法是在需要配置变量但不存在的每个点处抛出例如自定义 UnconfiguredApplicationException。然后,使用 a custom Exception Filtera custom Middleware componentthe existing UseExceptionHandler middleware 全局处理该异常。这需要更多代码,因为您必须在依赖配置数据的每个点添加检查,但不需要主动验证每个请求的配置数据。

实施

Microsoft documentation for filters 为资源和异常过滤器的基本构建提供了一些很好的指导。它还包括一个动作过滤器的例子,它可以添加到任何控制器动作中以获得更精细的方法。

检测配置

检测未配置应用的方式取决于您存储配置变量的方式和位置。最常见的方法是使用 IConfiguration provider,例如 appsettings.json,它可以与 Options Pattern 结合使用。 ASP.NET Core Filter documentation 提供了一个选项对象 (PositionOptions) 的基本示例,映射到 IConfiguration 提供程序 (appsettings.json),并使用 ASP.NET Core's Dependency Injection container 进行配置。>

设置页面

由于这通常是可再发行库的一部分,因此您的设置页面可能会通过 Razor Class Library 进行处理,它允许您将 Razor 视图和其他资产与您的库打包(例如,作为 NuGet 包)。通常,您从用户那里收集特定于其安装的信息(例如用户名、密码和服务器名称),然后使用这些信息建立连接字符串,然后将其保存到配置源。

检测数据库

如果您不知道数据库的类型,通常会在设置页面中询问。不过,我想,您也可以遍历每个驱动程序,尝试根据提供的凭据进行连接,以确定哪个驱动程序成功。但是配置应用程序的人应该知道他们安装了什么类型的数据库服务器!

结论

正如上面提到的,这是一个非常广泛的问题,有很多活动部分。不过,这应该有助于您入门,并使您熟悉此过程中涉及的主要组件,例如 ASP.NET Core FiltersASP.NET Core Configuration System、&c。