c# - 创建相关实体的责任

标签 c# domain-driven-design aggregation

我有一个名为“任务”的实体。对于这个实体,我可以创建多个实体,称为“评论”。我还想要一个名为“CreateComment”的方法。根据领域驱动设计,如果不创建“任务”类的实例,实体“评论”就不可能存在。我的问题是:这个方法应该放在哪里:在 Task 类中还是在 Comment 类中?它应该像 Comment.CreateComment 还是 Task.CreateComment。如果我把这个方法放到Task类中,会不会违反单一职责原则?

最佳答案

我认为该方法应该在 Task 实体上。但话虽这么说,该方法不应该是 Create 而是 Add 因为我不认为 Task 对象有责任创建一个评论。相反,我会使用这样的东西,这是一种矫枉过正,但主要是因为我喜欢进度流畅的界面和对象构建器模式:)

任务类,不言自明

public class Task
{
    private readonly IList<Comment> Comments = new List<Comment>();

    public void AddComment(ICommentBuilderFinalization commentBuilder)
    {
        Comments.Add(commentBuilder.MakeComment());
    }
}

评论类,再次 self 解释

public class Comment
{
    public string Text { get; set; }
    public string PostedBy { get; set; }
    public DateTime PostedAt { get; set; }
}

对象构建器和渐进式流畅接口(interface)

// First progressive interface
public interface ICommentBuilder
{
    ICommentBuilderPostBy PostWasMadeNow();
    ICommentBuilderPostBy PostWasMadeSpecificallyAt(DateTime postedAt);
}

// Second progressive interface
public interface ICommentBuilderPostBy
{
    ICommentBuilderPostMessage By(string postedBy);
}

// Third progressive interfacve
public interface ICommentBuilderPostMessage
{
    ICommentBuilderFinalization About(string message);
}

// Final
public interface ICommentBuilderFinalization
{
    Comment MakeComment();
}

// implementation of the various interfaces
public class CommentBuilder : ICommentBuilder, ICommentBuilderPostBy, ICommentBuilderPostMessage, ICommentBuilderFinalization
{
    private Comment InnerComment = new Comment();

    public Comment MakeComment()
    {
        return InnerComment;
    }

    public ICommentBuilderFinalization About(string message)
    {
        InnerComment.Text = message;
        return this;
    }

    public ICommentBuilderPostMessage By(string postedBy)
    {
        InnerComment.PostedBy = postedBy;
        return this;
    }

    public ICommentBuilderPostBy PostWasMadeNow()
    {
        InnerComment.PostedAt = DateTime.Now;
        return this;
    }

    public ICommentBuilderPostBy PostWasMadeSpecificallyAt(DateTime postedAt)
    {
        InnerComment.PostedAt = postedAt;
        return this;
    }
}

将它们放在一起

var task = new Task();
var commentBuilder = new CommentBuilder().PostWasMadeNow().By("Some User").About("Some Comment");

task.AddComment(commentBuilder);

好吧,正如我之前提到的,这个例子在大多数情况下都是过度设计的。但它应该让您了解如何才能忠实于单一职责原则。

关于c# - 创建相关实体的责任,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17404557/

相关文章:

c# - Entity Framework - 保存引用新记录的外键

domain-driven-design - DDD。我应该修改存储库中的实体吗?

elasticsearch - ElasticSearch 的 NEST 过滤器

architecture - DDD中用户生成的文件保存在哪里?

fluent-nhibernate - Fluent Nhibernate 域驱动设计

sql - 高效计算 SQL 中的重要术语

language-agnostic - 更喜欢组合而不是继承?

c# - Unity 按钮可掷 3D 骰子,在按钮上寻找 Rigidbody,而不是骰子对象

c# - 如何区分空的可空 Guid 或查询字符串中的无效 Guid?

c# 我想知道字符串中的前 3 个字符是否为字母?