✅ DB接続デモ
IDbConnectionFactory パターンによるRDBMS非依存の接続管理を体験するデモ
📚 IDbConnectionFactory パターン
接続先DBをコードを変えずに設定だけで切り替えられる設計パターンです。
インターフェース(RDBMS非依存)
public interface IDbConnectionFactory
{
string DatabaseType { get; }
IDbConnection CreateConnection();
Task<IDbConnection> CreateOpenConnectionAsync();
Task<bool> TestConnectionAsync();
}
appsettings.json(設定で切り替え)
{
"Database": {
"Provider": "SQLite" // ← ここを変えるだけ
},
"ConnectionStrings": {
"DemoSQLite": "Data Source=demo.db;"
}
}
DI登録(Program.cs)
// Provider設定に応じてファクトリを切り替え
var connectionString = builder.Configuration.GetConnectionString("DemoSQLite");
builder.Services.AddSingleton<IDbConnectionFactory>(sp =>
new SqliteConnectionFactory(connectionString, sp.GetRequiredService<ILogger<SqliteConnectionFactory>>()));
// Service は IDbConnectionFactory に依存するだけ(RDBMS種別を意識しない)
builder.Services.AddScoped<IDatabaseConnectionDemoService, DatabaseConnectionDemoService>();
🧪 デモ 1: 接続テスト
Factory 経由でDBに接続し、接続状態・DB種別・接続時間を確認します。
// Repository での使用例
public async Task DoSomethingAsync()
{
using var connection = await _factory.CreateOpenConnectionAsync();
// ... クエリ実行
} // ← using で自動的にClose・Dispose
🧪 デモ 2: テーブル一覧取得
SQLite の sqlite_master テーブルから存在するテーブル一覧を取得します。
// SQLite のメタデータテーブルを使用
var command = connection.CreateCommand();
command.CommandText =
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
🧪 デモ 3: 行数取得(SQLインジェクション対策)
テーブルの行数を取得します。テーブル名はホワイトリスト検証でSQLインジェクションを防ぎます。
// NG: 文字列連結(SQLインジェクションの危険)
command.CommandText = $"SELECT COUNT(*) FROM " + tableName;
// OK: ホワイトリスト検証してから使用
var tables = await GetTablesAsync();
if (!tables.Contains(tableName))
throw new ArgumentException("テーブルが存在しません");
command.CommandText = $"SELECT COUNT(*) FROM "{tableName}"";
🔗 参考リンク
- 📄 設計書: database-connection.md
- 📄 ADR-002: Raw SQL採用理由
- 💻 ソースコード(Factory): SqliteConnectionFactory.cs
- 🧪 テストコード: SqliteConnectionFactoryTests.cs