そのため、現在、MySQL をデータベース システムとして使用するかなり複雑な C# アプリケーションを作成しています。プログラム全体で MySQL を使用する最善の方法は何でしょうか? どこでも使用できるように静的関数を作成しますか? すべての通信を行う SQLHandler クラスを参照してください。
ありがとう!
データアクセス層として機能する可能性のあるインターフェイス内のデータアクセス機能を抽象化します。次に、MySQLで動作する実装を用意します。次に、データベースにクエリを実行する必要があるアプリケーションの他のレイヤーに常にインターフェイスを渡します。このようにして、これらのレイヤー間の弱い結合を取得し、それらのレイヤーを分離して単体テストを行うことができます。
例を見てみましょう。Product
モデルがあるとします。
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
これで、このモデルで実行する必要のある操作を抽象化するリポジトリを定義できます。
public interface IProductRepository
{
Product Get(int id);
}
そして、MySQLで動作するこのインターフェースの実装を持つことができます:
public class MySQLProductRepository: IProductRepository
{
private readonly string _connectionString;
public MySQLProductRepository(string connectionString)
{
_connectionString = connectionString;
}
public Product Get(int id)
{
using (var conn = new MySqlConnection(_connectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT name FROM products WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
using (var reader = cmd.ExecuteReader())
{
if (!reader.Read())
{
return null;
}
return new Product
{
Id = id,
Name = reader.GetString(reader.GetOrdinal("name"))
};
}
}
}
}
これで、製品で動作する必要のあるアプリケーションのすべてのレイヤーは、IProductRepository
コンストラクターパラメーターとしてasを取り、さまざまなCRUDメソッドを呼び出すことができます。
依存関係を配線し、で作業することを指定するのは、アプリケーションのコンポジションルート内のみですMySQLProductRepository
。理想的には、このリポジトリのインスタンスはシングルトンである必要があります。
NHibernate、Entity Framework、Dapperなどの一般的なORMSをチェックアウトして、リポジトリ内のさまざまなCRUD操作の実装を簡素化し、ドメインモデルへのマッピングを実行することもできます。ただし、ORMフレームワークを使用することにした場合でも、アプリケーション内のさまざまなレイヤーに関心の分離を行うことをお勧めします。これは、複雑なアプリケーションを設計するときに、保守性を維持したい場合に非常に重要です。
MySQLHandler
1つの接続を常に維持したい場合は、Singeltonを作成することをお勧めします。
using System;
public class MySQLHandler
{
private static MySQLHandler instance;
private MySQLHandler() {}
public static MySQLHandler Instance
{
get
{
if (instance == null)
{
instance = new MySQLHandler();
}
return instance;
}
}
}
接続数を気にしない場合は、静的MySQLHelper
クラスを作成することもできます。