読者です 読者をやめる 読者になる 読者になる

LINQ to SQL 用ファクトリクラス

以前、LINQ to SQLADO.NET Entity Framework で、接続するデータベースを動的に変更する方法を紹介しました。

仕事では仕様上、動的に接続先データベースを変更することが結構多くて、毎回こんなコードは書いていられないです。この方法を実際に使う場合、ファクトリクラスを作ることになると思います。下記は LINQ to SQL の例。

public static class DataContextFactory<T>
            where T : DataContext
{
    /// <summary>
    /// DataContext を生成します。
    /// </summary>
    /// <typeparam name="T">データコンテキストの型</typeparam>
    /// <param name="server">SQL Server インスタンス</param>
    /// <param name="database">データベース名</param>
    /// <param name="windows">Windows 認証のとき true。SQL 認証のとき false。</param>
    /// <param name="name">SQL 認証時のユーザー名</param>
    /// <param name="password">SQL 認証時のパスワード</param>
    /// <returns>データコンテキスト</returns>
    public static T CreateDataContext(string server, string database, bool windows = true, string name = null, string password = null)
    {
        // 接続文字列を作成
        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = server;
        builder.InitialCatalog = database;
        builder.IntegratedSecurity = windows;
        if (!windows)
        {
            builder.UserID = name;
            builder.Password = password;
        }

        // new() だと接続文字列を引数で渡せないので、
        // Activator を使って DataContext を生成
        return (T)Activator.CreateInstance(typeof(T), builder.ToString());
    }
}

ADO.NET Entity Framework の場合は、メタデータが必要になるので、同じようにはいかないです。多分、接続文字列を構成ファイルから読み込んで、インスタンス名やデータベース名を置換することになるんじゃないかな。試してないですけど。