App.Config 在用于从 WPF 和 ASP.NET 访问数据的 class 库中?
App.Config in a class library for data access from WPF and ASP.NET?
我第一次尝试使用 SQL 在我的一个项目中存储数据,我正在使用 this 教程,因为它对我来说最有意义,并且老实说,我喜欢这些家伙的视频,讨厌在找到一个我可以学习的视频之前点击数百个糟糕的视频。
无论如何,我正在制作一个应用程序,我需要访问并保存到我在 MSSMS 中创建的 SQL 数据库,我有一个 class 逻辑库,一个数据 class 用于数据访问的库,以及一个 WPF 界面(我还计划添加一个 ASP 界面,编辑功能较少,但添加 Web API,全部用于学习)
在连接 dapper 的视频中,这个人设置了一个帮助程序来获取连接字符串,但那是通过配置管理器查找 App.Config(他说这是内置的,你只需要添加一个参考,但现在看来是一个 NuGet 包)。
但是我在任何地方都没有 App.config
,而且我从来没有使用过它,所以我不知道我是否应该添加它,它会做任何事情,我应该在哪里添加它?或者我现在使用 .NET Core 而不是 .NET Framework 做一些完全不同的事情。
很抱歉 post 可能没有说得那么清楚,但我在第一个障碍上挣扎,Google 似乎对这个毫无用处。
作为旁注,我还计划从我的对象中保存键值对(如 Dictionary<string, string>
),我最好只拥有一个新的 table 只是为了那些并将其关联的对象的 I'd、键和值存储在它们自己的列中?
这是一个基本的 dotnet 核心命令行 exe
请注意,这是本文内容的松散迷你实现:https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/ConsoleOne
典型appsettings.json内容
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/ConsoleOne/appsettings.json
{
"ConnectionStrings": {
"MyConnectionString": "Data Source=someServer\someInstance,1433;Database=master;User Id=sa;Password=Password1#;"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}
这个顶层有并定义了这些值。在我的示例中,“ConsoleOne”是顶层。
我还有 BAL 和 DAL 层。
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/Bal
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/Dal
我的示例使用 Dapper,它会捕获连接字符串
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/Dal/EmployeeDataLayer.cs
public class EmployeeDataLayer : IEmployeeDataLayer
{
private readonly Microsoft.Extensions.Configuration.IConfiguration config;
public EmployeeDataLayer(Microsoft.Extensions.Configuration.IConfiguration config)
{
this.config = config;
}
public IDbConnection Connection
{
get
{
string connectionString = this.config.GetConnectionString("MyConnectionString");
return new SqlConnection(connectionString);
}
}
public async Task<Employee> GetByID(int id)
{
using (IDbConnection conn = this.Connection)
{
string sql = "SELECT ID, FirstName, LastName, DateOfBirth FROM Employee WHERE ID = @ID";
sql = "SELECT TOP 1 id as ID, 'FName' + name as FirstName, 'LName' + name as LastName, crdate as DateOfBirth FROM sysobjects order by id";
conn.Open();
var result = await conn.QueryAsync<Employee>(sql, new { ID = id });
return result.FirstOrDefault();
}
}
public async Task<ICollection<Employee>> GetByDateOfBirth(DateTime dateOfBirth)
{
using (IDbConnection conn = this.Connection)
{
string sql = "SELECT ID, FirstName, LastName, DateOfBirth FROM Employee WHERE DateOfBirth = @DateOfBirth";
sql = "SELECT TOP 3 id as ID, 'FName' + name as FirstName, 'LName' + name as LastName, crdate as DateOfBirth FROM sysobjects order by id";
conn.Open();
var result = await conn.QueryAsync<Employee>(sql, new { DateOfBirth = dateOfBirth });
return result.ToList();
}
}
}
(注意,我上面的 DAL 代码并没有访问真正的后端表,这是我做的一个简单的演示)
但回到配置:
我通过将 Configuration 对象“注入”到 class(参见构造函数)
来完成此操作
对于 dotnet-core,您通常使用内置的 IoC/DI
你可以在这里看到:
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/ConsoleOne/Program.cs
private static IServiceProvider BuildDi(IConfiguration config)
{
string connectionString = config.GetConnectionString("MyConnectionString");
return new ServiceCollection()
.AddSingleton<IEmployeeManager, EmployeeManager>()
.AddTransient<IEmployeeDataLayer, EmployeeDataLayer>()
.AddLogging(loggingBuilder =>
{
// configure Logging with NLog
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
loggingBuilder.AddNLog(config);
})
.AddSingleton<IConfiguration>(config)
.BuildServiceProvider();
}
我最后只是转到我的 UI 添加 > 新项目 > 应用程序配置文件,名为 App.config 并使用此代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<clear/>
<add name="Thenameasusedinmyapp" connectionString="Server =.; Database = NameofDatabase; Trusted_Connection = True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
我第一次尝试使用 SQL 在我的一个项目中存储数据,我正在使用 this 教程,因为它对我来说最有意义,并且老实说,我喜欢这些家伙的视频,讨厌在找到一个我可以学习的视频之前点击数百个糟糕的视频。
无论如何,我正在制作一个应用程序,我需要访问并保存到我在 MSSMS 中创建的 SQL 数据库,我有一个 class 逻辑库,一个数据 class 用于数据访问的库,以及一个 WPF 界面(我还计划添加一个 ASP 界面,编辑功能较少,但添加 Web API,全部用于学习)
在连接 dapper 的视频中,这个人设置了一个帮助程序来获取连接字符串,但那是通过配置管理器查找 App.Config(他说这是内置的,你只需要添加一个参考,但现在看来是一个 NuGet 包)。
但是我在任何地方都没有 App.config
,而且我从来没有使用过它,所以我不知道我是否应该添加它,它会做任何事情,我应该在哪里添加它?或者我现在使用 .NET Core 而不是 .NET Framework 做一些完全不同的事情。
很抱歉 post 可能没有说得那么清楚,但我在第一个障碍上挣扎,Google 似乎对这个毫无用处。
作为旁注,我还计划从我的对象中保存键值对(如 Dictionary<string, string>
),我最好只拥有一个新的 table 只是为了那些并将其关联的对象的 I'd、键和值存储在它们自己的列中?
这是一个基本的 dotnet 核心命令行 exe
请注意,这是本文内容的松散迷你实现:https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/ConsoleOne
典型appsettings.json内容
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/ConsoleOne/appsettings.json
{
"ConnectionStrings": {
"MyConnectionString": "Data Source=someServer\someInstance,1433;Database=master;User Id=sa;Password=Password1#;"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}
这个顶层有并定义了这些值。在我的示例中,“ConsoleOne”是顶层。
我还有 BAL 和 DAL 层。
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/Bal
https://github.com/granadacoder/dotnet-core-on-linux-one/tree/master/src/Dal
我的示例使用 Dapper,它会捕获连接字符串
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/Dal/EmployeeDataLayer.cs
public class EmployeeDataLayer : IEmployeeDataLayer
{
private readonly Microsoft.Extensions.Configuration.IConfiguration config;
public EmployeeDataLayer(Microsoft.Extensions.Configuration.IConfiguration config)
{
this.config = config;
}
public IDbConnection Connection
{
get
{
string connectionString = this.config.GetConnectionString("MyConnectionString");
return new SqlConnection(connectionString);
}
}
public async Task<Employee> GetByID(int id)
{
using (IDbConnection conn = this.Connection)
{
string sql = "SELECT ID, FirstName, LastName, DateOfBirth FROM Employee WHERE ID = @ID";
sql = "SELECT TOP 1 id as ID, 'FName' + name as FirstName, 'LName' + name as LastName, crdate as DateOfBirth FROM sysobjects order by id";
conn.Open();
var result = await conn.QueryAsync<Employee>(sql, new { ID = id });
return result.FirstOrDefault();
}
}
public async Task<ICollection<Employee>> GetByDateOfBirth(DateTime dateOfBirth)
{
using (IDbConnection conn = this.Connection)
{
string sql = "SELECT ID, FirstName, LastName, DateOfBirth FROM Employee WHERE DateOfBirth = @DateOfBirth";
sql = "SELECT TOP 3 id as ID, 'FName' + name as FirstName, 'LName' + name as LastName, crdate as DateOfBirth FROM sysobjects order by id";
conn.Open();
var result = await conn.QueryAsync<Employee>(sql, new { DateOfBirth = dateOfBirth });
return result.ToList();
}
}
}
(注意,我上面的 DAL 代码并没有访问真正的后端表,这是我做的一个简单的演示)
但回到配置:
我通过将 Configuration 对象“注入”到 class(参见构造函数)
来完成此操作对于 dotnet-core,您通常使用内置的 IoC/DI
你可以在这里看到:
https://github.com/granadacoder/dotnet-core-on-linux-one/blob/master/src/ConsoleOne/Program.cs
private static IServiceProvider BuildDi(IConfiguration config)
{
string connectionString = config.GetConnectionString("MyConnectionString");
return new ServiceCollection()
.AddSingleton<IEmployeeManager, EmployeeManager>()
.AddTransient<IEmployeeDataLayer, EmployeeDataLayer>()
.AddLogging(loggingBuilder =>
{
// configure Logging with NLog
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
loggingBuilder.AddNLog(config);
})
.AddSingleton<IConfiguration>(config)
.BuildServiceProvider();
}
我最后只是转到我的 UI 添加 > 新项目 > 应用程序配置文件,名为 App.config 并使用此代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<clear/>
<add name="Thenameasusedinmyapp" connectionString="Server =.; Database = NameofDatabase; Trusted_Connection = True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>