我正在将.netframework 4.7.2类库迁移到.netstandard 2.0库中。
在.netframework类库中使用了ConfigurationManager来读取应用程序的设置。
.netstanard中的System.Configuration.ConfigurationManager有任何可替代的选项。
迁移的类库需要在.net core web API和旧的.netframework web应用程序中使用。
正如我说的,你不应该直接依赖类库中的配置获取方式。保持你的类库的灵活性。
不要在你的类库中这样做。
public void UpdateProductName(int productId, string name)
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDatabase"]))
{
connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new { ProductId = productId, Name = name });
}
}
通过在你的类库中直接使用ConfigurationManager,你已经把类绑在了只允许获取连接字符串的一种形式上。这意味着如果你想使用appsettings.json,或者环境变量,或者KeyVault,或者其他任何获取配置的方法,你都不能。
相反,可以这样做。
public class MyDatabaseRepository
{
readonly string _connectionString;
public MyDatabaseRepository(string connectionString)
{
_connectionString = connectionString;
}
}
public void UpdateProductName(int productId, string name)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new { ProductId = productId, Name = name });
}
}
现在,这允许你在消费应用程序中以任何方式获取连接字符串。
在.NET Core应用程序中,你可能会这样做,通过Microsoft.Extensions.Configuration从appsettings.json获取连接字符串。
string connectionString = Configuration.GetConnectionString("MyDatabase");
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");
而且它仍然允许你在你的.NET框架应用程序中灵活地使用System.Configuration。
string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");
再加上 依赖性注入,这成为一个非常灵活和强大的工具。
你可以安装 ConfigurationManager
通过 套餐,它的目标是.Net Standard 2.0。
至于ASP.Net Core,请看以下内容 Microsoft.Extensions.Configuration.