【问题标题】:Should a factory return list of elements?工厂应该返回元素列表吗?
【发布时间】:2013-07-14 09:30:25
【问题描述】:

我正在尝试使用 DDD,并且我需要创建某种实体。该方法的接口与此类似:

public IEnumerable<Entity> CreateEntities(IEnumerable<Entity> entities, decimal someOtherParameter);

需要注意的是,在这个方法内部,entities 上有一个 group by。

我现在拥有的一个简化(很多)示例:

public IEnumerable<Entity> CreateEntities(IEnumerable<Entity> entities, decimal someOtherParameter)
{
    var grouped = entities.GroupBy(x=>x.SomeProperty);
    var result = new List<Entity>();
    foreach(var item in grouped)
    {
        result.Add(CreateEntity(item, someOtherParameter));
    }
    return result;
}

public Entity CreateSingleEntity(IEnumerable<Entity> entities, decimal something)
{
    return new Entity(){
        something = something,
        something2 = entities.Sum(x=>x.Amount),
        something3 = entities.First().something3
    };
}

以前我在Entity 类上将此方法作为静态方法。 (返回的单个实体是私有的)我正在考虑将这个逻辑转移到工厂。实现这一目标的最佳方法是什么?我的想法:

  • 有一个带有 CreateSingleEntity 方法的工厂,另一个 将在域服务中。
  • 将这两种方法移至工厂,并将 CreateSingleEntity 保持为私有(当我创建新实体时,我总是需要按部分进行分组)

【问题讨论】:

    标签: c# oop domain-driven-design factory


    【解决方案1】:

    工厂不一定是新类。通常另一个聚合负责创建新的实体或聚合。你的语言说什么?例如var post = forum.NewPost(user)

    【讨论】:

    • 我没有可能是您提到的“论坛”的聚合根。我只有用例。使用您的论坛示例,该过程可以描述如下:用户选择一些帖子,然后使用所选帖子,系统为原始帖子的每个作者创建一个新的单个帖子,其中包含所有内容给定的帖子。
    • 所以你在克隆/复制帖子?那是您的企业使用的语言吗? yourAggregate.Copy()?
    • 而是将聚合列表聚合成一个新的。看看我的例子——有 list.Sum(x>x.Amount) 之类的东西。
    • 那么它可能确实更适合单独的类。不过我会把这两种方法放在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2020-10-14
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多