【发布时间】:2018-04-06 22:42:07
【问题描述】:
我正在使用 asp.net core 2.0 和 dapper。我有一个包装 IDbConnection 接口并且只公开某些方法的类。这是该类的简短版本。
public class MyConnectionString : IMyConnectionString
{
private readonly IDbConnection _connection;
public int ConnectionTimeout => _connection.ConnectionTimeout;
public string Database => _connection.Database;
public string ConnectionString { get => null; set => _connection.ConnectionString = value; }
public ConnectionState State => _connection.State;
public MyConnectionString(IOptions<ConnectionProviderOptions> connProvOpts, EncryptionHelper encHelper)
{
var con = "some logic to get the connection string.";
_connection = new SqlConnection(con);
}
public int Execute(string query, object parameters = null)
{
using (var con = _connection) { return con.Execute(query, parameters); }
}
}
我通过构造函数将这个类注入到我的存储库服务中。例如,这是一个可以调用它的方法:
internal class SomeRepository
{
private readonly IMyConnectionString _connection;
public SomeRepository(IMyConnectionString connection)
{
_connection = connection;
}
public void ExecuteSomeQuery(Object params)
{
var query = "Some query...";
_connection.Execute(query, params);
}
}
现在的问题是,如果我在一个请求(2 个不同的服务)中调用 _connection.Execute(query, params); 两次,第二次调用 ConnectionString 类中的 ConnectionString 值是空的。我已经尝试在 Transient 和 Request 范围内绑定它,看看它是否会保留它,但没有运气。知道为什么会发生这种情况,或者我如何保存它,这样我就不必在每次请求时都创建连接字符串?
【问题讨论】:
-
“MyConnectionString 类中的ConnectionString 值是空的”...
ConnectionString { get => return null; ...,除了null,你希望它返回什么? -
同样
using (var con = _connection)在第一次执行后有效地处理_connection。 -
您应该在每个请求上创建一个新连接。由于连接池,几乎不会有任何开销。此外,使用 Facade 仅公开某些 Dappers 方法的目的是什么?我看不出这有什么好处。
-
@NikolajDamLarsen 并非所有
IDbConnection对象都很便宜——连接池仅适用于 SQL Server 和可能的其他第三方连接。例如,与 Access/JET 数据库的连接很昂贵,并且应该是长期存在的。 -
@Dai 当然可以,但根据他的问题,我可以安全地假设他正在使用 Sql Server,因为他正在创建
SqlConnection对象。
标签: c# dependency-injection asp.net-core asp.net-core-mvc