代码之家  ›  专栏  ›  技术社区  ›  Kevin Pang

业务逻辑应该放在域中还是放在服务中?

  •  5
  • Kevin Pang  · 技术社区  · 17 年前

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

    这很有效。但是,如果我们现在还想在用户购物车中添加商品时向用户发送电子邮件,该怎么办?我们可以将其添加到AddItemToCart中,但这需要向用户类中注入某种IEmailer依赖项。

    另一种方法是创建一个服务来处理此事务(例如ShoppingCartService),该服务将执行业务逻辑并发送电子邮件。然而,这导致了一个相当贫乏的领域(即用户类只是getter/setter)

    4 回复  |  直到 17 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    作为用户域逻辑一部分的逻辑应该留在用户中。这可能涉及也可能不涉及向用户实体注入服务。我认为这取决于服务是否是用户类业务逻辑的一部分,以及这样做是否遵循您的通用语言。

    我将写下:

    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");
        }
    }
    

    This related question 你可能会觉得有帮助的讨论。

        2
  •  1
  •   S.Lott    17 年前

    但是,这会导致一个相当贫乏的域(即用户类只不过是getter/setter)

    Cart.add() 将物品放入购物车。

    那么,如果用户类看起来过于简单怎么办?

        3
  •  0
  •   Jobo    17 年前

        4
  •  0
  •   Silvercode    17 年前

    在大型系统中,用户类最终将拥有许多不同类型的操作。这门课可能太大了。为了避免这种情况,应该有其他类为用户做一些事情。