2011-11-10 2 views
3

タイトルがベストと言われていない場合は、ごめんなさい。リポジトリは、必要なすべてのパラメータがメソッドに渡されることを確認する必要がありますか?

私のUserRepositoryには、新しいUserを作成するメソッドがあります。私の妥当性検査は、ユーザーを作成するために必要なすべてのフィールドが入力されていることを確認するためにチェックする必要があります:ユーザー名、パスワード、電子メール、作成済み。いずれかの値がNULLの場合、挿入によってエラーがスローされます。

public class UserRepository : IRepository<User> 
{ 
    public DbConnection Connection { get; set; } 

    public UserRepository(DbConnection connection) 
    { 
     this.Connection = connection; 
    } 

    public void Create(User user) 
    { 
     string sql = "INSERT INTO [dbo].[User] (Username, Password, Email, Created) VALUES (@Username, @Password, @Email, @Created)"; 

     using (DbCommand command = new SqlCommand()) 
     { 
      command.Connection = this.Connection; 
      command.CommandText = sql; 
      command.Parameters.Add(new SqlParameter("@Username", user.Username)); 
      command.Parameters.Add(new SqlParameter("@Password", user.Password)); 
      command.Parameters.Add(new SqlParameter("@Email", user.Email)); 
      command.Parameters.Add(new SqlParameter("@Created", user.Created)); 
      command.ExecuteScalar(); 
     } 
    }   
} 

私の作成メソッドは実際に値をここでチェックすべきですか?私はここで検証するべきではないと感じていますが、私は分離のための適切な場所がわかりません。

答えて

1

ビジネスロジックをデータアクセスコードと区別することは、常に良い考えです。ビジネスロジックコードをより読みやすく保守しやすくします。ここでの「検証」はビジネスロジックの一部なので、上位レイヤーで処理することをお勧めします。入力を受け取り、それらを検証し、リポジトリを介してDBアクセスを実行する "サービス"クラスを作成することを考えてください。

あなたのシナリオは「登録によって新しいユーザーを作成する」としましょう。 メソッドを持つRegistrationServiceクラスを持つことは理にかなっています。

Userクラス自体を検証のポイントに使用する別のオプションがあります。 Userクラスを不変にしたり、コンストラクタ内のすべてのパラメータを受け取ったり、構築中にそれらを検証したりすることができます。したがって、「無効な」インスタンスがある可能性は排除されます。パラメータとしてUserを受け取った関数は、実際には「有効なユーザー」インスタンスを受け取ることが保証されています。

最終的には、ヌル引数をチェックし、の機能にArgumentNullExceptionをスローすることを習慣にすることが有効です。

+0

本質的には、(null、空の文字列または正規表現)を検証するために私のサービスをチェックインし、私の作成メソッドで引き続き引数のヌル値をチェックするでしょうか? – Dietpixel

+0

はいリポジトリのcreateメソッドはnull入力のみをチェックします。デバッグを簡単にするだけです。 –

0

Userクラスの有効な状態の定義は、実際にはアプリケーション固有のものです。おそらくあなたはちょうど1つの場合にIDを欲しいと思うでしょう。おそらく、あなたはフル・オール・フィールド・ドリブンを別のものにしたいと思うかもしれません。

私にとって、これを決定する機能はCreateです。どのような情報ですかUserインスタンスからユーザーを作成する必要がありますか?

私はすぐそこにチェックします。

関連する問題