首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

多視窗應用程式資料庫連線代碼的最佳實踐:集中管理與依賴注入

     編輯:關於SqlServer

問題場景

WinForms/WPF 多視窗應用中,每個視窗(Form/UserControl)都需要存取資料庫。若在每個視窗重複撰寫連線字串、using System.Data.OleDb、建立 OleDbConnection,會導致:

  • 連線字串分散,修改極其困難
  • 命名空間重複引用
  • 連線物件生命週期難以控制(洩漏、並發衝突)
  • 單元測試無法模擬資料層

推薦架構:資料存取層 + 依賴注入

1. 連線字串集中配置

App.config / appsettings.json:

<connectionStrings>
  <add name="Default" connectionString="Provider=SQLOLEDB;Data Source=.;Initial Catalog=MyDB;User ID=sa;Password=***" />
</connectionStrings>

2. 封裝資料庫工廠與基礎 Repository

public static class DbFactory
{
    private static readonly string _connStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
    public static IDbConnection CreateConnection() => new OleDbConnection(_connStr);
}

public abstract class RepositoryBase : IDisposable
{
    protected readonly IDbConnection _conn;
    protected RepositoryBase() => _conn = DbFactory.CreateConnection();
    public void Dispose() => _conn?.Dispose();
}

3. 具體 Repository 實作

public class UserRepository : RepositoryBase
{
    public User GetById(int id)
    {
        const string sql = "SELECT * FROM Users WHERE Id = ?";
        using (var cmd = _conn.CreateCommand())
        {
            cmd.CommandText = sql;
            cmd.Parameters.Add(new OleDbParameter("?", id));
            _conn.Open();
            using (var reader = cmd.ExecuteReader())
                return reader.Read() ? Map(reader) : null;
        }
    }
    // ... CRUD 方法
}

4. 視窗透過建構函式注入 Repository

public partial class UserForm : Form
{
    private readonly UserRepository _repo;
    public UserForm(UserRepository repo) { _repo = repo; InitializeComponent(); }
    private void LoadData() => grid.DataSource = _repo.GetAll();
}

5. 應用程式啟動時組裝(簡易容器或手動)

static class Program
{
    [STAThread]
    static void Main()
    {
        var repo = new UserRepository();
        Application.Run(new UserForm(repo));
    }
}

進階選項

  • 連線池: OleDb/SQL Server 連線字串預設啟用池化,CreateConnection 即從池取用,無需手動管理
  • IoC 容器: 專案較大時引入 Autofac / Microsoft.Extensions.DependencyInjection,實現自動注入與生命週期管理
  • Unit of Work: 跨多 Repository 的交易一致性需求,可引入 UoW 模式統一 Commit/Rollback

總結

將資料庫連線邏輯封裝於專屬層,視窗僅依賴抽象介面(Repository),透過建構函式注入具體實作。 這樣既解決了代碼重複、連線字串分散,又為未來遷移 ORM、單元測試、微服務化鋪平道路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved