エンティティモデルにメソッドを追加する最適な方法は何でしょうか。MVC 3エンティティモデル - メソッドを追加しますか?
このように、私はUser
モデルを持っており、パスワードをハッシュするクラスにメソッドを追加したいと考えています。
User
を拡張するUserHelper
クラスを作成しようとしましたが、これはほとんど逆効果的なようです。
エンティティモデルにメソッドを追加する最適な方法は何でしょうか。MVC 3エンティティモデル - メソッドを追加しますか?
このように、私はUser
モデルを持っており、パスワードをハッシュするクラスにメソッドを追加したいと考えています。
User
を拡張するUserHelper
クラスを作成しようとしましたが、これはほとんど逆効果的なようです。
EFクラスが部分クラスでない場合、T4テンプレートを変更して部分クラスにすることができます。
partial classは、複数のファイルにまたがって定義されたクラスです。コンパイル時に、コンパイラはすべてのファイルからクラス定義を作成します。部分クラスは、EF用のT4テンプレートなど、自動化されたツール(通常は世代が実行されるたびに破棄される)によって生成されるクラスにコードを追加するために最も一般的に使用されます。
上記のように部分クラスを使用すると、「拡張」しようとしているクラスとは別のファイルにメソッドを追加できます。
これをすべて言わせると、extension methodsも考えられます。
エクステンションメソッドは、あなたができないタイプの機能を拡張するためのきちんとした構文/コンパイラのトリックです(例えば、コードを所有していないか、サブクラス化できないなど)。拡張メソッドを書くことによって、基本的に拡張した型のインスタンスメソッドであるかのように呼び出される静的メソッドを記述しています。
私はどちらのオプションもほぼ同じくらい良いと思っていますが、部分クラスメソッドのほうがいいです。
部分的なクラスと拡張メソッドはここではあなたの目的を果たすことはできますが、この特定のケースでは、モデルにそのロジックを実装させるのではなく、認証サービスにパスワードハッシュを渡す方が良いでしょう。このサービスでは、ユーザー名とパスワード(プレーンテキスト、まだハッシュ化されていない)を入力として受け取り、認証に成功するとIPrincipal
を返します。それ以外の場合は例外をスローします。認証が失敗したことを示す)。
簡体字、私はそうのようなサービスを呼びたい:
IPrincipal user = _authService.Authenticate(username, password);
if (user == null)
{
ShowErrorMessage("No such user!");
}
else
{
ShowStatusMessage("Login successful!");
}
このサービスはまた、新しいユーザーを作成するなど、ユーザーの削除を処理します - おそらくEFを使用してリポジトリを介してデータベースに連絡します。 (あなたのEFモデルは、ハッシュされたパスワードを保存するプロパティを必要としますが、ハッシュ自体はモデルでは起こらず、サービスによって行われます)。
さらに詳しい情報は便利です。ユーザーモデルはモデルクラスのモデル、データアクセスレイヤーはどこですか? – griegs
@griegs申し訳ありませんが、私は知りたいですが、@ Esteban Araya anwserを見ると、彼は私が何を話しているかを知っているようです。 – Paramount
部分クラスだけでなく、[拡張メソッド](http://msdn.microsoft.com/en-us/library/bb383977.aspx)もあります。しかし、私はパーシャルを使用します。 – Rup