2010-11-18 70 views
0

标题neds的工作,但我可以想到的最好的解释是一个例子。DDD:与其他许多其他对象相关的对象,还是仅与另一个对象相关的对象?

假设您有一个“注释”对象,表示可以附加到系统中其他类型对象的注释,例如Account,Appointment或其他。笔记只有日期和笔记的内容,并且只能应用于另一个对象的一个​​实例。

因此,这是更好的:

注意,可以有它不适用于(注意必须说明是为的预约的引用类型的空引用的
  • 一种类型,但空的帐户/其他对象在系统中它不是)
  • 重复相同的逻辑,但避免具有无关笔记引用的多笔记类型(AppointmentNote,AccountNote)。

请记住,这些是持久性类,我不希望技术上由于具有子类注释类型而使事情复杂化。在这种情况下,我希望保持域名尽可能平坦。

回答

-1

为什么不只是其他对象引用的单个Note类呢?约会,帐户等只是一个Note对象的通用列表。

+0

为了让持久对象发生这种情况,Note将为n-1个字段(其中n是可以在其上注释的对象的数量)具有空fkeys。这是我用第一种方法解决问题的关键。多重性是'预约/账户1 - *注' – 2010-11-18 18:36:17

+0

@SnOrfus:也许我没有看到关于你的ORM的东西(或者我可能只是休息一天)。但至少从领域的角度来看,让对象带着适用于他们的笔记似乎是有意义的。除非有一种情况,一个人从一张纸条开始,需要找到其父母?我认为笔记会是第一流的父对象的二等加载项。为什么笔记需要参考他们的父母? – David 2010-11-18 18:46:19

2

因此,这是更好的:

  • 一个需要注意的是可以有它不适用于(注意必须说明是为的预约的引用类型的空引用,但空的类型对于系统中不存在的帐户/其他对象)
  • 复制相同逻辑但避免具有不相关注释引用的多个注释类型(AppointmentNote,AccountNote)。

也没有。另外,我不清楚我们是在谈论你的对象还是你的表格。

有一种类型的注释。它不应该引用它所涉及的对象。

public class Note 
{ 
    public DateTime CreatedAt { get; set; } 
    public string Content { get; set; } 
} 

public class Account 
{ 
    public ICollection<Notes> Notes { get; } 
} 

public class Appointment 
{ 
    public ICollection<Notes> Notes { get; } 
} 

然后有一对夫妇的方式来铺陈数据库表,这两个应该很容易地与任何ORM支持(虽然不一定容易,以支持一个不真正-AN-ORM,但-half-look-like-one,例如Linq2SQL或SubSonic,可为每个数据库表生成类的工具)。

首先DB布局:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content, 
    AccountId, 
    AppointmentId 
) 

那么,如果n-1外键为空。这是每级类型的平行式样式,它被接受为对某些子类无效且无意义的列。

方法二:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content 
) 

TABLE AccountNotes 
(
    AccountId, 
    NoteId 
) 

TABLE AppointmentNotes 
(
    AppointmentId, 
    NoteId 
) 

,这将是更多的表,每级的布局。没有人说你实际上需要在代码中使用子类注释类型 - 但即使你这样做了,为了避免“打击你的工具”,它并不意味着逻辑的重复 - 只需使用基本类型并将你的行为放在那里。

最后,你将不得不选择。关于预约的说明与账户记录本质上不同,你将不得不在某个层面上处理它。

+0

+1 - 您已经以更简洁的方式正确地重申了我的难题。你说得对,我不得不选择,我只是不确定你在鼓吹什么。 – 2010-11-18 19:31:58

+0

好吧,你的意见和问题似乎是说你不想挑选。还有,关于你的对象模型或数据库表的问题呢?如果对象,我只给了一个选项。如果表格是完全有效的。选择一款适合您数据访问工具的产品。我倾向于选择每班级的表,但只是因为所有额外的表和ID都可能成为开发 - 调试周期的拖累。 – 2010-11-18 19:36:42

相关问题