【发布时间】: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