8

現実の世界では、コントローラーはさまざまなデータベーステーブルやその他のデータストアからのデータを使用する必要がある可能性があります。例えば:

[Authorize]
    public class MembersController : Controller
    {
        ICourseRepository repCourse;
        IUserCourseRepository repUserCourse;
        IMember member;
        public MembersController(ICourseRepository repCourse, IUserCourseRepository repUserCourse, IMember member)
        {
            this.repCourse = repCourse;
            this.repUserCourse = repUserCourse;
            this.member = member;
        }

それで:

  1. テーブルごとにリポジトリを使用する必要がありますか?

  2. これが集合体の概念が作用するところだと思いますか?アグリゲートごとに1つのリポジトリが必要ですか?

  3. コントローラのコンストラクタに必要な数のリポジトリを追加するだけですか?

  4. これは私のデザインが間違っているというサインですか?

ノート:

IMemberインターフェースは、基本的に、メンバーシッププロバイダーに良い顔をするヘルパーオブジェクトを表します。つまり、すべてのコードを1か所に配置します。例えば:

        Guid userId;
        public Guid UserId
        {
            get
            {
                if (userId == null)
                {
                    try
                    {
                        userId = (Guid) Membership.GetUser().ProviderUserKey;
                    }
                    catch { }
                }
                return userId;
            }
        }

それに関する1つの問題は、確かにこの種の出力をキャッシュすることです。別の質問が来るのを感じることができます。

編集:

私はDIにNinjectを使用しており、DI、DDD、およびTDD全体でかなり売れています。まあ、ある種。私も実用主義者になろうとしています...

4

3 に答える 3

6

1.テーブルごとにリポジトリを使用する必要がありますか?

おそらくそうではありません。テーブルごとにリポジトリがある場合は、基本的にActiveRecordを実行しています。また、ドメイン駆動設計の「リポジトリ」の概念と、Linq2SQL、SubSonicで一般的に使用されるようになったテーブルごとのクラス「リポジトリ」との間に混乱が生じる可能性があるため、これらのクラスを「リポジトリ」と呼ぶことは避けたいと思います。など、および多くのMVCチュートリアル。

2.これが集合体の概念が作用するところだと思いますか?アグリゲートごとに1つのリポジトリが必要ですか?

はい、はい。あなたがこのルートに行くつもりなら。

「3.」コントローラのコンストラクタに必要な数のリポジトリを追加するだけですか?

コントローラがリポジトリに直接触れないようにします。また、ビューがドメインクラスに直接触れないようにします。

代わりに、私のコントローラーには、ビューモデルを返す役割を担うQueryクラスがあります。Queryクラスは、ビューモデルをコンパイルするために必要なリポジトリ(または他のデータソース)を参照します。

于 2010-11-24T17:49:07.717 に答える
2

さて@awrigley、ここに私のアドバイスがあります:

Q:テーブルごとにリポジトリを使用する必要がありますか?

A:いいえ、質問2で述べたように、アグリゲートごとにリポジトリを使用し、アグリゲートルートでのみ操作を実行します。

Q:コントローラーのコンストラクターに必要な数のリポジトリーを追加するだけですか?

A:IoCとコンストラクター注入を使用していると思います。この場合は、実際の依存関係のみを渡すようにしてください。この投稿は、このトピックを決定するのに役立つ場合があります。

(pst!その空のキャッチは良いことではありません!!);)

乾杯!

于 2010-11-24T17:57:49.677 に答える
-1

これはすべて、「ドメイン駆動設計」がどのようになるかによって異なります。集約ルートとは何か知っていますか?ほとんどの場合、基本的なCRUDをすべて実行できる一般的に型指定されたリポジトリで十分です。これが問題になり始めるのは、コンテキストと境界を持つ厚いモデルを使い始めたときだけです。

于 2010-11-24T17:47:40.733 に答える