nfp*_*lee 2 c# sql-server sqlite unit-testing unity-container
我的Web应用程序具有以下类:
public class DatabaseProvider {
private readonly IDbConnection _cn;
public DatabaseProvider(IDbConnection cn) {
_cn = cn;
}
public void ExecuteNonQuery(string query) {
// Execute the query
var cmd = _cn.CreateCommand();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码声明IDbConnection依赖项(使用Microsoft Unity):
container.RegisterType<IDbConnection>(new InjectionFactory(c => {
var cn = new SqlConnection("...");
cn.Open();
return cn;
}));
Run Code Online (Sandbox Code Playgroud)
这允许我将连接换成SQLite,如下所示:
container.RegisterType<IDbConnection>(new InjectionFactory(c => {
var cn = new SQLiteConnection("Data Source=:memory:;Version=3;");
cn.Open();
return cn;
}));
Run Code Online (Sandbox Code Playgroud)
我在测试时使用SQLite,连接必须保持打开,否则数据会丢失.因此,我不能在需要时打开和关闭连接.
我总是在需要时打开与数据库的连接,并想知道这是否可以扩展到大型应用程序?
我很感激有关如何改进的建议.谢谢
作为ADO.NET中的一般规则,必须尽快关闭连接.
连接从连接池重用,是稀缺资源.
建议的方法是使用using(){}构造.
我们强烈建议您在使用完毕后始终关闭连接,以便将连接返回到池中.您可以使用Connection对象的Close或Dispose方法,或打开C#中using语句内的所有连接,或Visual Basic中的Using语句来执行此操作.未显式关闭的连接可能不会添加或返回到池中.有关更多信息,请参阅使用语句(C#参考)或如何:为Visual Basic处理系统资源(Visual Basic).
所以,我建议您创建一个接口IDbProvider然后进行2个实现:SqlServerProvider和SQLiteProvider并处理它们内部的打开和关闭连接.然后使用Unity绑定一个提供者或另一个提供者.
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |