我有一个问题,不确定在假设 DDD 并使用 C#/EF Core 时如何解决。
简化的情况:我们有 2 个聚合 - Item和Warehouse。他们每个人都有自己的身份,通过ExternalId(Guid)来识别它的外部(FE等),这也被视为它的域身份。它还具有在数据库模型中标识它的数据库Id - 实体模型和数据库模型与 EF Core 是同一类,允许使用私有字段 - 仅公开外部 ID 和必需字段。实体(DDD 和 EF Core 意义上的实体)包含大量与对象严格耦合的业务逻辑和方法。一般来说,我遵循eShop/eShopOnContainers示例中的模式。
Item 被分配给 Warehouse,当创建一个 item 时,我们需要将 Warehouse 传递给它的构造函数。
将完整的 Warehouse 对象传递给 Item 的构造函数(以及 Item 定义的其他方法)是否正确:
public Item(Warehouse warehouse,..)
Run Code Online (Sandbox Code Playgroud)
或者我应该仅依赖数据库 ID:
public Item(long warehouseId,..)
Run Code Online (Sandbox Code Playgroud)
我对此有一个问题,因为从一方面我读到聚合不应引用其他聚合,但另一方面使用数据库数据库会将实现细节(关系数据库中的对象持久性)泄漏到域模型,这不应该发生在我的域模型中。观点。
使用外部 ID:
public Item(Guid warehouseId,..)
Run Code Online (Sandbox Code Playgroud)
并不能解决问题,因为数据库中的实际关系并不基于它。
你有什么意见 ?我有点纳闷。
我在使用 .Net Core 开发 Restful webapi 时遇到问题,我无法使用 HTTP POST 方法来插入复杂类型对象而不将参数指定为“FromBody”。根据 Microsoft 的文档...
在 HTTP POST 上使用复杂类型时,我不必指定[FromBody]数据注释,它应该可以正常工作,但是当我尝试使用 webapi 中的方法时...
// POST api/checker/
[HttpPost]
public int Insert(Entity e)
{
Console.WriteLine($"Entity: {e.ID} - {e.Name}");
}
Run Code Online (Sandbox Code Playgroud)
其中实体有一个 id 和一个名称,使用这个客户端方法......
string json = JsonConvert.SerializeObject(entity);
HttpClient client = new HttpClient();
HttpResponseMessage message = await client.PostAsync(
"http://localhost:5000/api/checker",
new StringContent(json, Encoding.UTF8, "application/json"));
Run Code Online (Sandbox Code Playgroud)
该对象以 0(ID)和 null值到达 webapi (name),除非 webapi 方法签名使用[FromBody]注释。我在这里错过了什么吗?我已经做了一个研究,无法弄清楚这一点。
更新:
这是我的实体类:
public class Entity
{
public int …Run Code Online (Sandbox Code Playgroud)