【问题标题】:Access connection strings from .NET Core and .NET MVC/Webforms in a .NET Standard assembly在 .NET Standard 程序集中从 .NET Core 和 .NET MVC/Webforms 访问连接字符串
【发布时间】:2020-01-16 19:27:45
【问题描述】:

我有一个 .NET Standard 2.0 程序集,我一直将它与我的 MVC 和 Webforms 应用程序一起用于执行一些实体框架的工作。在我简单使用过的所有应用程序中:

ConfigurationManager.ConnectionStrings[""]

但是 .NET Core 不支持这一点,而是坚持我使用 Configuration

所以我有两个问题:

  1. 我是否可以在 .NET Standard 中使用与内置平台无关(无论是 Webforms、MVC 还是 .NET Core)来读取连接字符串?
  2. 如何从 .NET Standard 程序集中确定我是从 .NET Core 还是其他任何东西中调用,以便我可以使用 ConfigurationConfigurationManager?我猜我将不得不到处洒target framework conditionals

【问题讨论】:

  • @Dmitriy 那篇文章谈到了引入旧的配置管理器。虽然可行,但这似乎是一种代码味道。真的没有 .Net 标准解决方案吗?
  • "196 是的,ConfigurationManager.AppSettings 在引用 NuGet 包 System.Configuration.ConfigurationManager 后在 .NET Core 2.0 中可用。感谢 @JeroenMostert 为我提供了解决方案。"够你吃吗?
  • 我的代码在 .Net STANDARD 库中,可以从 .Net Core 和 MVC、Webforms 访问。所以添加 ConfigurationManager 不是这里的问题。当 .Net Core 和 MVC/Webforms 都访问 STANDARD 库时,这是一种不可知论的方式。
  • 不可知的方法很简单:不要这样做,并坚持你的客户明确地将连接字符串传递给需要它们的类(即使用依赖注入)。这是 .NET Core 选择的路径,而不是传递全局变量,并且是与两者兼容的方法。假设应用程序将使用任何一种特定方式,无论平台如何,都是不正确的。移植的 .NET Core 应用程序可能会选择坚持使用 ConfigurationManager 以减少必须更改的代码量,或者它们可能不会 - 您无法在运行时可靠地检测到这一点。

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


【解决方案1】:

这似乎是依赖注入的用例。在类库中使用 ConfigurationManager.* 或 Environment.* 无论如何都不是一个好习惯。将这些设置视为库的依赖项,并从库的调用方注入环境/框架/应用程序特定设置。

// Class is part of this or common library
public class AppSettings
{
    public string AppDbConnectionString { get; set; }

    // more settings
}

public class MyLib
{
    private srting _connectionString;

    // Inject settings 
    public MyLib(AppSettings settings)
    {
        _connectionString = settings.AppDbConnectionString;    
    }
}

【讨论】:

  • 虽然我理解依赖注入参数,但它有点矫枉过正。以前,我能够将配置文件作为 CI 的一部分进行操作,并且一切正常。由于我的 WebForms/MVC 和现在的 .NET Core 代码都使用了此代码,因此我希望使用相同的配置方法,因为它们最终还是有配置文件。由于 .NET Core,我现在必须改造我所有的 Webforms/MVC 应用程序来传递数据。
  • @TheEdge:如果您想要 .NET Core 但使用标准配置文件,您仍然可以 -- 您只需引用 System.Configuration.ConfigurationManager 即可。如果您要允许配置“.NET Core 方式”,您不能假设他们甚至会首先使用配置文件,因为 .NET Core 配置更加灵活,但您不是必需 i> 这样做。 System.Configuration.ConfigurationManager 包是一个 .NET 标准包,因此可用于 Core。您可以使用现收现付的方式进行移植;行为不是强制性的。
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 2018-05-25
  • 2016-10-02
  • 2023-03-16
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多