在 .NET Standard 程序集中从 .NET Core 和 .NET MVC/Webforms 访问连接字符串

Posted

技术标签:

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

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

ConfigurationManager.ConnectionStrings[""]

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

所以我有两个问题:

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

【问题讨论】:

看到这个***.com/questions/47591910/… @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 以减少必须更改的代码量,或者它们可能不会 - 您无法在运行时可靠地检测到这一点。 【参考方案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。您可以使用现收现付的方式进行移植;行为不是强制性的。

以上是关于在 .NET Standard 程序集中从 .NET Core 和 .NET MVC/Webforms 访问连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

Oracle .Net ManagedDataAccess 错误:无法从程序集中加载类型“OracleInternal.Common.ConfigBaseClass”

NHiberante从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑

使用 blazor 加载外部 .NET Standard 2.0 程序集

有没有办法以可读的形式从 .NET 程序集中检索编译器生成的代码?

C#:无法从程序集中加载类型

针对 .NET Core 与 .NET Standard