4

场景:在域模型对象中使用工厂?

在我的应用程序(它使用丰富的领域模型,其中逻辑在模型中,而不是在服务)我有用户。我创建新用户与服务

User newUser = userService.createNewUser("Hans Dampf"); 

或由于每一个电话到我的应用程序有一个用户对象直接访问从数据库

User oldUser = userDao.findByName("Hans Dampf"); 

得到他们,我想使用的用户对象作为我的领域模型的入口点。

每个用户可以有不同类型的图库,保存在另一个表中。

class User { 
@OneToMany(fetch = FetchType.LAZY) 
@JoinColumn(name = "userId") 
private Set<Gallery> automatic = new HashSet<Gallery>(); 
} 

我想要一个简单的方法来启用特定的画廊。所以,我的API会是什么样子:

User user = ... // creating or retriving user 
user.enableMainGallery(); 

在此方法中它会necassary创建一个新的画廊对象,并把它添加到画廊的名单。但是如何创建这个新实例?使用工厂?这将需要将工厂注入域对象(可能有问题)。

public void enableAutomaticGallery() { 
    automatic.add(automaticFactory.createAutomaticGallery(this)); 
} 

或者是我的接口定义有缺陷?我是否应该用其他方式来定义它,这样我就不必注入工厂了?怎么样?

+0

在这里的帖子http://evan.bottch.com/2007/12/06/factory-and-repository-in-the-domain/它谈论工厂和DAO是如何是领域模型的一部分,我们不应该将它们视为应用程序级别的对象。我不确定我的立场,但这是另一种观点 – 2013-03-26 06:18:44

回答

1

正如你所说,域对象不应该依赖于应用程序级对象,如工厂或Daos。

的域通常:

  • 复足够与功能的需求,而无需添加其他问题(如持久性,验证,GUI等...)
  • 中央和使用无处不在(因为它的复杂性会在许多编码活动中损害您的生产力)
  • 可重复使用跨相关应用程序,并且在所有图层中甚至可以被序列化并发送到diff (除非它与应用程序级对象有关)

所以你的enableAutomaticGallery方法应该在一个Service对象上。 它可以有相同的代码,但会依赖于应用程序。

+0

但是,这会导致贫血域模型,不是吗?我将不得不暴露画廊的集合,而逻辑将在对象之外。或者我忽略了什么? – Arne 2010-01-20 15:28:30

+0

@Arne平衡有时很难找到,我曾经像你一样严格地考虑面向对象,并且不想在几个类中分离关注点。但是这个领域非常复杂,对于每个开发人员来说都非常重要,而且有太多的代码可能会被所有关注点所添加,所以我发现这是不切实际的。现在我的域是我的代码的中心,装饰着注释(用于持久性,验证等)。关注点是不同的代码,可以是单独的类(DAO,Service,GUI相关)或技术代码(触发验证)。 – KLE 2010-01-20 15:45:12

+2

服务层的存在并不会使您的域模型变得贫乏。当应用程序中的所有逻辑都以服务结束时,您的域模型仅包含您已经“贫血”的状态。请记住,面向对象编程的重点是将行为(方法)和状态(字段)组合成一个单一的工件,即类。但是,有一个服务层可以帮助协调域中对象之间的活动,这是完全合理的。 – 2010-01-20 16:44:31

1

您的域模型应该对任何服务或DAO图层或甚至任何工厂对象一无所知。

我会建议,而不是方法User.enableMainGallery()需要将Gallery对象添加到实例集合(如您所说),而不是暴露方法User.addGallery(Gallery)

这样,负责“启用图库”的类通过向 列表 集合中添加对象来完成此操作。

换句话说,我不认为User对象应该知道“启用主要图库”的含义。这听起来像是属于商业逻辑(我知道,模棱两可的术语)的umbrealla。

+0

这看起来很有希望,似乎是一个很好的回答。但是这个规模好吗?我想添加一个类型为“OldGallery”的画廊,并有要求将其升级为“NewGallery”。在我的设计中,这将导致一个方法“User.upgradeGallery(x)”(我同意用户类似乎要承担很多责任)。但是如果用户只管理集合,那么逻辑再次在模型之外!我将有一个“GalleryService”,从用户中删除旧的画廊,并添加新的!? – Arne 2010-01-20 16:09:18

+0

我个人认为,我认为“领域模型”不应该有像“为这个用户添加一个图库”或“将旧图库升级到新图库”这样的逻辑。有些人可能称之为“贫血症” - 我并不十分熟悉这一论点。我更喜欢将这个逻辑放在一个单独的层中,这样模型可以完全是“模型”。 – 2010-01-20 16:38:39

+0

好的......但那么模型中属于哪种逻辑呢? – Arne 2010-01-21 10:13:07