2016-04-01 12 views
0

スタックに1つの問題があります。私は一般的なリポジトリを使用し、それを使ってストアドプロシージャを呼び出そうとします。私が知っている唯一の方法は、文字列としてプロシージャ名を渡すプロシージャ名を文字列として渡さずに、リポジトリパターンを使用してストアドプロシージャを呼び出す方法

DataContext.Database.ExecuteSqlCommand(sql, parameters); 

それとも

DataContext.Database.SqlQuery<T>(sql, parameters); 

を呼び出すことです。しかし、私は既に自分のDBContextにプロシージャを持っています。実際にプロシージャ名を文字列として渡すことを避ける方法はありませんか?

答えて

1

文字列型に特有の問題がありますか、またはレポに定義されている定数のように「マジック文字列」を参照していますか?文字列名をコンストラクタ経由で設定された値として渡し、DIコンテナにそれらを提供させるのがより快適でしょうか?

もう1つのオプションでは、文字列を持ち、ExecuteSqlCommandまたはSqlQueryをラップしてストアードプロシージャと同じ名前を付ける拡張メソッドをデータベースオブジェクトに定義すると、DataContext.Database.MyStoredProcedure(paramaters)のようになり、リポジトリはこれを知らない実装の詳細。

私はリポジトリパターンを使用すると、リポジトリの目標の1つは永続性の実装の詳細を隠すことです。リポジトリを呼び出すものは何もないので、私は個人的に文字列を使用するだけで問題はありません賢明。

+0

もちろん、私はプロシージャ名を格納するためにenumを使用することができましたが、DBContextにプロシージャがあるとすぐにDbSet にアナログを使用する可能性があると思いました。私はsmthを変更した後、コンパイルエラーを得ることを好むため、不正です。私が単体テストで見つけなければならない "マスクされた"エラーを得るのではなく、モデルの中で。しかし、実際それは私の好みの唯一の質問です。お返事ありがとう! – Julia

+0

確かにenumを使うことができますが、誰かがスキーマを変更してsprocの名前を変更しても、実行時エラーです。 おそらく根本的な問題は汎用リポジトリですか?私は通常、集約ごとのリポジトリを好んでいます。そうすることで、リポジトリ内の特定のモデルに特化した問題はありません。私は、ジェネリックリポジトリを使用している場合、その中に100万ストアドプロシージャを持つ "godクラス"になる可能性があることがわかりました。 – Brook

+0

私はあなたが正しいと思っています...多分私は私のレポジトリコンセプトを本当に変えるでしょう。 – Julia