2010-11-27 5 views
2

私はここで別の質問をしていましたが、1人のユーザーが実際に私に次のことを示唆して混乱させました:私は1000回それを読んでいるので、エンティティはサービスを介してセーブ/データベース。それはViewModelの仕事だ!MVVMデザインパターンのViewModelまたはModelからサービスを呼び出しますか?

あなたはどう思いますか?

public class School 
{ 
    private ISchoolRepository _repository; 

    public string Name { get; set; } 

    public School() 
    { 
     this._repository = IoC.Resolve<ISchoolRepository>(); 
    } 

    public bool IsValid() 
    { 
    // Some kind of business logic? 
    if (this.Name != null) 
    { 
     return true; 
    } 

     return false; 
    } 

    public void Save() 
    { 
     if (this.isValid()) 
     { 
     this._repository.Save(this) 
     } 
} 

答えて

1

いけません私はエンティティが文脈的または環境的状態から解放されるのが好きだからです。私は、エンティティのストレージを管理することはリポジトリの唯一の責任であると思います。

エンティティ間に依存関係がある場合はどうなりますか?たとえば、学校には学生がいます。あなたが学校を救うまでは、生徒を救うことはできません。このロジックを学生の実体に組み込む必要があります。あなたの生徒も学校を救うでしょうか?彼らは救うことを拒否しますか?彼らは学校のデータベースをチェックする必要がありますか?彼らは少なくとも学校について何かを知る必要があるので、あなたは学校と学生の間に依存関係を作り、それは結構ハードなものです。

次に教師を追加し、それらのために同様のロジックを追加する必要があります。これらの関係や依存関係を表すコードは、多くのエンティティに広がっています。トランザクションについても考えてみてください。次に、複数の層を追加します。これがどんなに複雑になるか見ていますか?まもなくミートボールとチーズのスパゲッティがあります!

これを知ることはリポジトリの責任です。

HTH

乾杯

+0

そう!さらに123を行く:P – Elisabeth

0

エンティティからのサービスの呼び出しは、単一責任原則に違反します。将来的に、エンティティをサービスとは異なるバッキングストアから水分補給する必要がある場合は、すべてのエンティティを変更する必要があります。あなたがリポジトリを注入していても、依然としてSRPに違反しています。私はからスワップアウトしたい場合は、このアプローチが間違っているかを理解いけない

0

は、SQLサーバーがOracleに私は単に「OracleSchoolRepositoryと呼ばれる新しいリポジトリを登録しますと、それはそれはISchoolRepositoryインタフェースを満たすことを確認言う。

I私はエンティティとリポジトリを混在させないであろうとすべての問題を参照してください?上記は問題になるだろうというとき、あなたがシナリオを強調することはできますか?

ありがとう!

ベン

+0

あなたは別のアプローチを使用しているように見えるとしてあなたを求め;-)笑ない私に – Elisabeth

+0

イムをSRMを頼みますか?どうして?あなたはどんな問題を解決していますか? – BenjaminPaul

+0

私はこの問題を解決しようとする=> http://stackoverflow.com/questions/4288493/wpf-mvvm-re-use-a-viewmodel-in-multiple-controller-and-separation-of-concerns/4292411#4292411すでに議論に参加しました;-)私は解決策を見つけるでしょう、今日ではなくすぐに。 – Elisabeth

関連する問題