5

ドメイン エンティティ User があり、User がアイテムをショッピング カートに追加できるようにしたいとします。ここで、ショッピング カート内のアイテムが一意であることを確認したいので、User クラス内に次の関数を作成します。

function AddItemToCart(Item item)
{
    // Add business logic to make sure item is unique
}

これはうまくいきます。しかし、アイテムがカートに追加されるたびにユーザーに電子メールを送信したい場合はどうなるでしょうか? これを AddItemToCart に追加できますが、User クラスにある種の IEmailer 依存関係を挿入する必要があります。

別の方法として、このトランザクションを処理するサービス (ShoppingCartService など) を作成して、ビジネス ロジックを実行し、電子メールを送信することもできます。ただし、これはかなり貧弱なドメインにつながります (つまり、User クラスは getter/setter に他なりません)。

4

4 に答える 4

3

ユーザーのドメイン ロジックの一部であるロジックは、ユーザーにとどまる必要があります。これには、User エンティティへのサービスの注入が含まれる場合と含まれない場合があります。サービスが User クラスのビジネス ロジックの一部であるかどうか、およびこれを行うことがユビキタス言語に準拠しているかどうかに依存すると思います。

私はこれを書きます:

class ShoppingCartService
{
    private EmailService emailer;

    public void addItemToUserCart(User u, Item i)
    {
        u.addItemToCart(i);
        this.emailer.sendEmailTo(u, "Item " + i.toString() + " was added to your cart");
    }
}

この関連する質問には、役に立つと思われる議論があります。

また、結合を減らすために、ゲッターとセッターの範囲をできるだけ制限することをお勧めします。

于 2009-01-14T03:59:14.453 に答える
1

「しかし、これはかなり貧弱なドメインにつながります (つまり、User クラスはゲッター/セッター以外の何物でもありません)」

ユーザーはドメイン全体ではありません。

カート、アイテム、アイテムをカートにCart.add()入れる洗練されたものがあります。

では、User クラスが単純に見える場合はどうでしょうか。

于 2009-01-14T02:25:16.720 に答える
0

大規模なシステムでは、ユーザークラスはさまざまな種類の操作を持つことになります。クラスが大きくなりすぎる可能性があります。それを避けるために、ユーザーのために何かをする他のクラスが必要です。

于 2009-01-14T11:18:25.583 に答える
0

メソッドはそのままにして、トランザクションを処理するサービス クラスを作成します。サービス クラス メソッドが呼び出されると、そこに電子メール ロジックを挿入できます。

于 2009-01-14T02:18:03.957 に答える