Spring 银行交易的领域和服务方法

Spring 银行交易的领域和服务方法,spring,domain-driven-design,Spring,Domain Driven Design,我试图学习Spring框架,并看到许多示例使用域和服务对象(域驱动设计?),但我无法真正理解如何实现它们。例如,我尝试对一个简单的银行应用程序建模,该应用程序包含客户、帐户和交易。以下是我的模型草案: Domain objects: Customer id userName password Account: id customerId balance Tra

我试图学习Spring框架,并看到许多示例使用域和服务对象(域驱动设计?),但我无法真正理解如何实现它们。例如,我尝试对一个简单的银行应用程序建模,该应用程序包含客户、帐户和交易。以下是我的模型草案:

Domain objects:
     Customer
         id
         userName
         password
     Account:
         id
         customerId
         balance
     Transaction:
         id
         accountId
         amount
         transactionDate
         transactionType

Service objects:
     AccountService:
         create(Account)
         update(Account)
         debit(Account,amount,date,remarks)
         credit(Account,amount,date,remarks)
         transfer(fromAccount,toAccount,amount,remarks)
         findAccountsByCustomerId(customerId)?
     CustomerService:
         findCustomerByName()
         findAccountsByCustomerId(customerId)?
  • CustomerService或AccountService是否应该使用findAccountsByCustomerId(customerId)方法

  • 哪些域/服务对象应表示借方/贷方交易?要定义的帐户域对象或服务对象中的debit()和credit()方法?我希望保留事务,而不仅仅是更新余额

  • 所有的业务逻辑都应该在服务层吗?我看到大多数spring的例子都是这样的

  • 因为这里的想法是检索帐户,所以它应该在 会计服务

  • 这两种方法在AccountService中对我来说都很好,因为您 按帐户操作。如果要持久化事务,请 如果有一个TransactionDao帮你处理这件事 每次需要时,都从AccountService调用它。做 这两种AccountService方法都允许您 交易的如果发生以下情况,则不希望持久化事务对象 更新余额引发了一个异常

  • 当您有业务逻辑而没有业务逻辑时,服务是有用的 属于你的道层。后者应该询问您的问题 数据库,并返回相应的域对象 服务主要用于做额外的处理,如搬运 事务或DTO映射


  • 你应该看看官方的Spring示例应用程序,给你一个想法。

    如果你的对象可以“满足”你的需求,那么它应该在你的模型中,因为它是域驱动的。如果问题是关于上下文(时间、检查外部系统等),那么它只能在服务中完成(或者您的模型中会有关于外部内容的依赖项:您不希望这样)。谢谢@LMeyer,这非常有帮助。在PetClinic应用程序中,只定义了一个将处理所有域对象的服务(ClinicService)。那么我应该只创建一个服务作为BankService吗?即使是复杂的应用程序也只有一个服务?对不起,我是这个服务/领域模型的新手,正在尝试了解它们的范围。@Skar不一定,PetClinic是一个简单的应用程序,所以一个服务是好的,它仍然是一致的(毕竟诊所确实处理宠物、兽医和客户)。然而,在更复杂的应用程序中,并没有什么可以阻止你们做一些像现在这样的服务。总的来说,只是不要打破规则