2011-07-18 3 views
2

エンティティモデルにメソッドを追加する最適な方法は何でしょうか。MVC 3エンティティモデル - メソッドを追加しますか?

このように、私はUserモデルを持っており、パスワードをハッシュするクラスにメソッドを追加したいと考えています。

Userを拡張するUserHelperクラスを作成しようとしましたが、これはほとんど逆効果的なようです。

+0

さらに詳しい情報は便利です。ユーザーモデルはモデルクラスのモデル、データアクセスレイヤーはどこですか? – griegs

+0

@griegs申し訳ありませんが、私は知りたいですが、@ Esteban Araya anwserを見ると、彼は私が何を話しているかを知っているようです。 – Paramount

+0

部分クラスだけでなく、[拡張メソッド](http://msdn.microsoft.com/en-us/library/bb383977.aspx)もあります。しかし、私はパーシャルを使用します。 – Rup

答えて

3

EFクラスが部分クラスでない場合、T4テンプレートを変更して部分クラスにすることができます。

partial classは、複数のファイルにまたがって定義されたクラスです。コンパイル時に、コンパイラはすべてのファイルからクラス定義を作成します。部分クラスは、EF用のT4テンプレートなど、自動化されたツール(通常は世代が実行されるたびに破棄される)によって生成されるクラスにコードを追加するために最も一般的に使用されます。

上記のように部分クラスを使用すると、「拡張」しようとしているクラスとは別のファイルにメソッドを追加できます。

これをすべて言わせると、extension methodsも考えられます。

エクステンションメソッドは、あなたができないタイプの機能を拡張するためのきちんとした構文/コンパイラのトリックです(例えば、コードを所有していないか、サブクラス化できないなど)。拡張メソッドを書くことによって、基本的に拡張した型のインスタンスメソッドであるかのように呼び出される静的メソッドを記述しています。

私はどちらのオプションもほぼ同じくらい良いと思っていますが、部分クラスメソッドのほうがいいです。

+0

これを達成するためのエレガントな方法があることをうれしく思っています。もう説明していただけますか?これは私の最初の.Netプロジェクトであり、少し失われています。 – Paramount

+0

@Paramout:もう少し情報を追加しました。助けてくれることを望む。 –

+0

ありがとうございます。私はクラスをインポート(使用)しているにもかかわらず、新しいメソッドを呼び出すときに完全な名前空間を使用する必要があるようです。これは正しいです? – Paramount

3

部分的なクラスと拡張メソッドはここではあなたの目的を果たすことはできますが、この特定のケースでは、モデルにそのロジックを実装させるのではなく、認証サービスにパスワードハッシュを渡す方が良いでしょう。このサービスでは、ユーザー名とパスワード(プレーンテキスト、まだハッシュ化されていない)を入力として受け取り、認証に成功するとIPrincipalを返します。それ以外の場合は例外をスローします。認証が失敗したことを示す)。

簡体字、私はそうのようなサービスを呼びたい:

IPrincipal user = _authService.Authenticate(username, password); 
if (user == null) 
{ 
    ShowErrorMessage("No such user!"); 

} 
else 
{ 
    ShowStatusMessage("Login successful!"); 
} 

このサービスはまた、新しいユーザーを作成するなど、ユーザーの削除を処理します - おそらくEFを使用してリポジトリを介してデータベースに連絡します。 (あなたのEFモデルは、ハッシュされたパスワードを保存するプロパティを必要としますが、ハッシュ自体はモデルでは起こらず、サービスによって行われます)。

関連する問題