これは、スタックオーバーフローではなくコードレビューのための多分質問です。Dapperを使用したリポジトリデザインパターン
私はMicroORMのためにDapperを使用してSQL Server 2014にデータを取得して保存しています。DBから取得したデータを表すDTO ProjにはDTOクラスがあります。
リポジトリが必要な場合は、自分のサービスレイヤでリポジトリパターンを使用しています。その依存関係を挿入するためにコンストラクタDIを使用していて、その作業を行うリポジトリのメソッドを呼び出しています。
私は、CustomerServiceとCarServiceという2つのサービスがあるとしましょう。
次に、2つのリポジトリにCustomerRepositoryとCarRepositoryがあります。
私は各リポジトリ内のすべてのメソッドを定義し、次に具体的な実装を定義するインタフェースを持っています。
例示的な方法は、(DB INSERT(ストアドプロシージャのために実際の文字列変数に注意してくださいを実行するストアドプロシージャを呼び出すクラスの上部にプライベート文字列として定義される)を以下に示す:
public void SaveCustomer(CustomerDTO custDTO)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
db.Execute(saveCustSp, custDTO, commandType: CommandType.StoredProcedure);
}
}
これはすべて正常に動作しますが、すべてのリポジトリのすべてのメソッドでusingブロックを繰り返すことになります。他のすべてのリポジトリは継承し、ベースはDB接続のインスタンス化を実装します?
これは、システム上の複数の同時ユーザーでも問題なく動作しますか?
:私は、次のpublic interface IBaseRepository
{
void Execute(Action<IDbConnection> query);
}
public class BaseRepository: IBaseRepository
{
public void Execute(Action<IDbConnection> query)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
query.Invoke(db);
}
}
}
を作成したシラスの回答に基づいて
**** **** UPDATE
はしかし、私のリポジトリに、私は、以下のような他の方法を持っています
public bool IsOnlyCarInStock(int carId, int year)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
var car = db.ExecuteScalar<int>(anotherStoredSp, new { CarID = carId, Year = year },
commandType: CommandType.StoredProcedure);
return car > 0 ? true : false;
}
}
と
public IEnumerable<EmployeeDTO> GetEmployeeDetails(int employeeId)
{
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
return db.Query<EmployeeDTO>(anotherSp, new { EmployeeID = employeeId },
commandType: CommandType.StoredProcedure);
}
}
Generic Type Tを使用してこれらをBaseリポジトリに追加する正しい方法は何ですか?すべてのタイプのDTOまたは任意のC#ネイティブタイプを返すことができます
これは達成するための方法です。あなたのIDbConnectionを廃棄するために、あなたのBaseRepository Disposableを作成する必要があります。マイクロソフトのドキュメントでは、リポジトリパターンと作業単位のパターンを使用して作業することができます。https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef- 5-using-mvc-4/asp-net-mvc-application-in-asp-net-mvcアプリケーションのリポジトリとユニットの実装 – OrcusZ
'using'ブロックはあなたが開いているので必要な悪です閉じなければならないデータベースへの接続。だから、繰り返しが必要です。私は、リポジトリデザインのパターンの内容全体に惑わされないように勧めています。 –
@Callum - あなたはどのようなパターンを提案するか、例を挙げて説明できますか?私はCQRSを使って調べましたが、上記のようなリポジトリがKISS –