聚合根的工厂方法签名

时间:2009-10-06 14:34:33

标签: domain-driven-design aggregate method-signature factory-method

我想编写一个工厂方法来实例化一个聚合根的实体。

该方法是否应该将聚合的子实体和值作为实例化对象接受,还是应该只接受基本类型?

例如,如果我有一个由Processor和Memory对象组成的实体计算机,那么工厂方法应采用以下形式:

public Computer NewComputer(
    string computerName, 
    int processorCores, 
    int processorClockSpeed, 
    string memoryType, 
    int memoryRam) 
{
    ...
}

public Computer NewComputer(
    string computerName, 
    Processor processor, 
    Memory memory) 
{
    ...
}

这只是品味问题,还是有任何严肃的考虑因素?

3 个答案:

答案 0 :(得分:2)

这只是一个品味问题,虽然它可能取决于你的对象创建策略,而且你可能会混合和匹配它们。

如果您的聚合根已经拥有其子对象的工厂方法(例如,如果CreateProcessor()已经存在以支持添加其他处理器),那么您的第一种方法可能是合适的。

或者,如果您正在使用ComputerFactory(或存储库)来创建或重新构建聚合根,那么该工厂可能已经知道如何创建子对象,在这种情况下,它将在创建子对象的过程中创建它们你的汇总图表和你的第二种方法是合适的。

答案 1 :(得分:1)

'聚合根'是对象图的最顶层节点。通过此根对象创建和访问所有其他对象。换句话说:如果通过外部工厂方法创建Computer类的组件,则不能再将其称为“聚合根”。 这并不是说你的第二个例子有点不好或有点臭,只是它不符合'聚合根'概念...

答案 2 :(得分:1)

关于使用工厂方法的好处(我不太熟悉聚合和根的规则):

  • 我认为处理器和内存是具有某些行为的对象,您希望将它们从计算机类中分离出来。
  • 计算机类构造函数可以是

    public Computer(string computerName, IProcessor processor, IMemory memory) 
    {
    }
    

您的计算机类现在不依赖于处理器和内存的特定实现。其他类负责使用具有特定内存和处理器的计算机。

通过这种方法,您可以获得更多可维护代码,并且无需更换计算机即可升级内存和处理器。

不知道这是否会在您的特定情况下回答您的问题,但希望这会有所帮助。其他资源包括:

  1. http://www.objectmentor.com/resources/articles/inheritanceVsDelegation.pdf
  2. SOLID电子书:http://www.lostechies.com/content/pablo_ebook.aspx