【问题标题】:DDD One to Many with many properties to single id of father [closed]DDD一对多,父亲的单一ID具有许多属性[关闭]
【发布时间】:2022-01-22 03:24:41
【问题描述】:

这是有 DDD 经验的人的问题。 如果我们有一个具有两个属性但都是父项的 FK 的子实体,那么设计子实体的最佳方法是什么? 例如,我们有用户实体,而您的公司实体具有两个属性,声明 ManagerId 和 DirectorId 都应该是用户实体 Id 的 FK。

这段代码会是好的做法吗?

public class User: IAggregateRoot 
{
      public int Id {get; private set;}
      public string Name {get;private set;}
      private readonly List<Company> _directorCompanies = new List<Company>();
      public List<Company> DirectorCompanies => _directorCompanies.AsReadOnly();
      private readonly List<Company> _managerCompanies = new List<Company>();
      public List<Company> ManagerCompanies => _managerCompanies.AsReadOnly();
      public User(string name)
      {
        Name = name
      }
} 
public class Company: IAggregateRoot
{
  public int Id {get;private set;}
  public string Name {get;private set;}
  public int DirectorId {get;private set;}
  public int? ManagerId {get;private set;}
  public User Director {get;private set;}
  public User Manager {get;private set;}
  public Company(string name, int directorId, int? manangerid)
  {
    Name = name;
    DirectorId = directorId;
    ManagerId = managerId;
  }
}

稍后通过此解决方案,我可以为特定公司取名,该公司是董事,如果有的话,谁是经理。否则,如果我这样管理:

 public class User: IAggregateRoot 
    {
          public int Id {get; private set;}
          public string Name {get;private set;}
          public User(string name)
          {
            Name = name
          }
    } 
    public class Company: IAggregateRoot
    {
      public int Id {get;private set;}
      public string Name {get;private set;}
      public int DirectorId {get;private set;}
      public int? ManagerId {get;private set;}

      public Company(string name, int directorId, int? manangerid)
      {
        Name = name;
        DirectorId = directorId;
        ManagerId = managerId;
      }
    }

如何在存储库中使用include 获取名称? 我关心的是什么是正确的方法,好的方法来实现这种情况,如果需要的话,我可以获得主管或经理的信息。 问候,

【问题讨论】:

  • 这里没有可回答的问题。最接近问题的是“我怎样才能获得包含在存储库中的名称”,我不知道您的意思。
  • 如果您只想结合公司和用户对象,可以使用简单的面向对象方法来实现。
  • @RobertHarvey 用我的问题说“我怎样才能获得包含在存储库中的名称”我的意思是如果我调用存储库模式,例如:_unitOfWork.CompanyRepository.SelectList(includes:"${nameOf("Director")}"),类似这样。
  • 我会从普通的面向对象开始。暂时忘记 DDD(它是一种设计技术,而不是编码技术),只关注如何以产生所需结果的方式组合类。
  • 您需要更多普通面向对象方面的经验,然后才会担心“正确性”。

标签: c# .net-core domain-driven-design .net-5


【解决方案1】:

我认为您的问题是了解 OO 编程的基础知识,

public class User: IAggregateRoot 
{
      public int Id {get; private set;}
      public string Name {get;private set;}
      private readonly List<Company> _directorCompanies = new List<Company>();
      public List<Company> DirectorCompanies => _directorCompanies.AsReadOnly();
      private readonly List<Company> _managerCompanies = new List<Company>();
      public List<Company> ManagerCompanies => _managerCompanies.AsReadOnly();
      public User(string name)
      {
        Name = name
      }
}

这个_directorCompanies_managerCompanies 没有多大意义,因为用户可以成为经理,经理必须成为用户,但没有所有用户成为经理或董事。我认为这种设计的方式是:

public class User: IAggregateRoot 
{
      public int Id {get; private set;}
      public string Name {get;private set;}
} 

public class Company: IAggregateRoot
{
  public int Id {get;private set;}
  public string Name {get;private set;}
  public int DirectorId {get;private set;}
  public int? ManagerId {get;private set;}
  public virtual User Director {get;private set;}
  public virtual User Manager {get;private set;}  
}

是你展示的东西,但遵循 OO 的思维方式。

对于查询,一个例子:

管理员用户

myContext.Users.Where(c => myContext.Managers.Contains(m => c.Id));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多