5

誰かが以前にこれを尋ねたと確信していますが、どこを見つけるのに苦労しています。

Ninject を使用して、リポジトリ デザイン パターンと共に、コントローラーから依存関係を削除しています。

私が理解しているように、このアプローチの利点の 1 つは、リポジトリとドメイン エンティティを簡単に切り離して、必要に応じて別のアセンブリを使用できることです。その結果、ドメイン エンティティとリポジトリを外部アセンブリに保持し、インターフェイスからすべての依存関係をモックできます。

ほとんどの場所でインターフェイスを使用してドメイン エンティティを参照できますが、モデル バインディングに関しては具象クラスへの参照を使用する必要があるようです。これは私が理解しているシリアライゼーションに関係していると読みましたが、ドメインエンティティを参照して別のモデルを作成することを避ける唯一の方法はありますか?

カスタム モデル バインディングでできることはありますか?

ちょっとした背景: 私は経験豊富な ASP.net 開発者ですが、MVC は初めてです。

4

3 に答える 3

8

ビュー モデルは、ロジックのない単純なデータ コンテナーである必要があるため、依存関係をまったく持たないようにする必要があります。代わりに、リポジトリをコントローラに挿入し、必要なデータをリポジトリからビュー モデルの適切なプロパティに割り当てます。

于 2011-11-08T11:11:44.200 に答える
5

依存性注入フレームワークを使用する主な利点は、IoC (制御の反転) です。

  • 疎結合
  • 柔軟性の向上
  • 簡単なテスト

したがって、通常行うことは、次のようなインターフェースを介してリポジトリを注入することです

public class MyController : Controller
{
    private IPersonRepository personRepo;

    public MyController(IPersonRepository personRepo)
    { 
        this.personRepo = personRepo;
    }
    ...
}

テスト中に、これにより、テストしたい値を正確に返すモックリポジトリを簡単に挿入できます。

ドメイン エンティティを注入することは、特定のクラス/コントローラーの機能とより緊密にリンクされているため、あまり意味がありません。したがって、それらをさらに抽象化することは、メリットではなくオーバーヘッドにすぎません。代わりに、実際のエンティティ モデルをコントローラーから切り離したい場合は、MVVM パターンを調べて、特殊な "ViewModel" を作成します。

コントローラーのテスト容易性の観点から考えてみてください。

  • DB アクセス -> リポジトリ
  • 外部依存関係 -> 他の BL クラス、WS 呼び出しなど。

通常、ドメイン エンティティは単なるデータ コンテナーであるため、ここには含めません。

于 2011-11-08T11:06:28.300 に答える
1

いくつかの詳細が役立ちます。おそらく少しのコードですか?

まず、依存関係をドメイン エンティティに注入することは避け、代わりにドメイン サービスを使用する必要があります。

ここにいくつかの詳細情報があります。

編集 001:

用語を明確にする必要があると思います。製品、カテゴリなど、すべてのドメイン エンティティを含むドメイン層があります。次に、ドメイン エンティティを水和するリポジトリを含むデータ層があり、データ層と通信するアプリケーション サービスを含むサービス層があります。

最後に、ビューとコントローラーを含むプレゼンテーション レイヤーを作成します。コントローラーは、アプリケーション サービス層と対話します。そのため、製品コントローラーはカタログ サービス (GetProductBySku など) と通信します。CatalogueService には、そのコンストラクター (IProductRepository、ICategoryRepository など) に注入された 1 つ以上のリポジトリーがあります。ビューモデルも持つことは、asp.net mvc では非常に一般的です。ViewModel をアプリケーション サービス レイヤーに配置します。

したがって、「モデル」や「ドメイン エンティティ」と言うときの意味がよくわかりませんが、用語が明確になることを願っています。

于 2011-11-08T11:00:22.783 に答える