5

私は NerdDinner チュートリアルに取り組んできましたが、そのほとんどは理にかなっています。私がよくわからないのは、モデルオブジェクトではなく、リポジトリがコントローラーで直接使用される理由です。たとえば、独自のメンバーシップ システムを実装する必要があり、Login メソッドを含む AccountController がある場合、それを接続するための最適なソリューションは何でしょうか? 例えば

Login(username,password){

    repo = AccountRepository

    account = repo.getLogin(username,password)

    //check account isn't locked

    //check account has been verified etc etc 

    //throw error or proceed to secure area

}

また

Login(username,password){

    repo = AccountRepository

    account = repo.getLogin(username,password)

    account.login() //business logic is handled in Account (Model)

}

また

Login(username,password){

    //no reference to repository

    account = Account

    //Account (Model) uses repository and handles business logic
    account.login(username,password) 

}

AccountController が AccountRepository から情報を取得して Account オブジェクトに渡すのではなく、Account オブジェクトで AccountRepository を直接使用することをお勧めします。

NerdDinner スタイル:

1 ログイン要求が受信される
2 AccountController は AccountRepository を使用して要求に基づいてログインの詳細を取得する
3 AccountController は Account オブジェクトを使用し、ステップ 1 からの情報を渡す
4 Account オブジェクトは要求を処理し、AccountController に通知する

私が提案していること:

1 ログイン要求が受信される
2 AccountController は Account オブジェクトを使用して要求に基づいてログインを処理する
3 Account オブジェクトは AccountRepository を使用してログインの詳細を取得する
4 Account オブジェクトは要求を処理し、AccountController に通知する

後者のスタイルの理由は、AccountRepository からログインの詳細が返された後、従うべきビジネス ルールがあるためです。たとえば、アカウントがロックされているか、アカウントが検証されているかなどです。 2段以上。後者のスタイルでは、AccountRepository を使用しながらすべてのロジックをまとめます。

Account.Login(username,password){
    repo = AccountRepository

    account = repo.GetLogin(username,password)

    //check account isn't locked

    //check account has been verified etc etc

    //throw error or proceed to secure area
}

それが理にかなっていることを願っています。

4

5 に答える 5

4

mvc の「モデル」は、ドメイン モデルではなくプレゼンテーション モデルです。MVC のモデルは、コントローラーがビュー エンジンにフィードするために使用するデータ転送オブジェクトと見なすことができます。コントローラーは、サービス層に接続された唯一のアクターです。

于 2009-05-15T22:19:01.310 に答える
2

少なくとも、リポジトリ インターフェイスとのやり取りを担当する別のレイヤー (コントローラーではない) が必要です。Thil を使用すると、UI を別のものに変更できます (コントローラーはその一部です)。このように、コマンド ライン、デスクトップ、Web インターフェイスのいずれであっても問題ありません。

ASP.NET MVC では、モデル (ドメイン モデルではなく、MVC のモデル) を MVC のプロジェクトではなく、別のプロジェクトに配置することを好みます。これにより、DTO (MVC モデル) を他の種類の UI と共有できます。

于 2009-10-04T22:04:17.807 に答える
1

リポジトリはインフラストラクチャの問題です。あなたがしていることは、モデルをインフラストラクチャに依存させることです。それは一種の後ろ向きなやり方です。つまり、依存性注入を使用するなどのことをしたい場合は、コンテナからモデルを解決する必要がありますが、これはあまり意味がありません。

また、ポイントは、すべてを 1 つの場所に保持することではありません。懸念事項を論理的な単位に分けておくように努める必要があります。このようにして、アプリケーションのどの部分が何をするのかを簡単に識別できます。また、テストにも適しています。

于 2009-05-15T22:19:51.870 に答える
1

ログインを実行するのはアカウントではないと思いますが、アカウントを使用してアプリケーションにログインするため、アカウントで Login メソッドを呼び出すのは少し不自然に思えます。

ドメイン駆動設計では、Account クラスに収まらないビジネス ロジックの場所があります。これはサービスと呼ばれます。DDD サービスの詳細については、こちらなどをご覧ください。

于 2009-05-15T22:21:04.080 に答える
0

モデル内にデータアクセスを配置することは避けます。これにより、モデルがストレージ メカニズムに依存する可能性が非常に高くなります。私は通常、このロジックをサービス/ビジネス ロジック レイヤーに配置し、データ レイヤーとモデルに話しかけます。モデルとコントローラーのみを使用する場合、このジョブを実行するのはコントローラーになります。

私は、ドメイン モデルをおもちゃやツールのグループと考えています。それらは、手に取ったり、使用したり、操作したりします。おもちゃは、どこに保管されているかを気にする必要はありません。おもちゃを棚や工具箱に置けるようにします。おもちゃには影響ありません。

于 2009-05-15T22:20:08.327 に答える