C#REST API-用ID字段装饰GET返回的实体 背景
当使用者使用POST/PATCH/PUT谓词与我的RESTAPI交互时,我不想公开包含ID字段的实体。原因是API的使用者根本不应该修改此字段 但是,当使用者使用GET重试一个实体时,我希望该实体的ID被公开 示例: 本文将Product类型的实体作为参数。此产品没有ID字段,因为它将由API自动生成。在响应对象中,返回产品,包括其自动生成的ID 问题: 如何以良好的可维护方式实现这一点 可能的解决方案 我已经确定了两种方法来实现这一点,它们不包括魔术,并且可以很好地使用自动生成的招摇过市文档 第一个解决方案: 创建一个没有标识符的基类,然后创建一个继承自该基类并添加ID字段的子类 基类: 子类: 结果招摇过市: 缺点: 实际上,我将使API的每一层中的实体数量增加一倍C#REST API-用ID字段装饰GET返回的实体 背景,c#,rest,design-patterns,architecture,C#,Rest,Design Patterns,Architecture,当使用者使用POST/PATCH/PUT谓词与我的RESTAPI交互时,我不想公开包含ID字段的实体。原因是API的使用者根本不应该修改此字段 但是,当使用者使用GET重试一个实体时,我希望该实体的ID被公开 示例: 本文将Product类型的实体作为参数。此产品没有ID字段,因为它将由API自动生成。在响应对象中,返回产品,包括其自动生成的ID 问题: 如何以良好的可维护方式实现这一点 可能的解决方案 我已经确定了两种方法来实现这一点,它们不包括魔术,并且可以很好地使用自动生成的招摇过市文档
第二种解决方案:添加一个泛型装饰器类 通用装饰器:
公共类标识属性,其中EntityType:class
{
公共Guid Id{get;set;}
公共EntityType实体{get;set;}
}
结果招摇过市:
缺点:
丑陋的json对象
有更好的解决方案吗?我知道您需要一些通用解决方案(例如,注释),但您是否可以使用映射到DTO对象?@Matt这是正确的,或者至少是我可以遵循的通用模式。关于你提到的映射。我不太确定我是否完全理解你。我很想看一个例子,我的意思是这样的。这是手工制作的,但是你可以用Automapper之类的东西来加速这个过程。@Matt谢谢你的例子!这也是一个解决方案,但它与我的第一个解决方案有相同的问题。对于我在API的每一层中创建的每个抽象,我必须有一个实体和一个EntityDTO。此外,如果我需要更改Entity中的字段,我也必须在EntityDTO中更改它们:(看看这个,尝试一下并报告结果。我也对这个问题和解决方案感兴趣:)我知道您需要一些通用解决方案(例如,注释),但是你能使用映射到DTO对象吗?@Matt这是正确的,或者至少是我可以遵循的通用模式。关于你提到的映射。我不太确定我是否完全理解你。我很想看一个例子,我的意思是这样的。这是手工制作的,但是你可以用Automapper之类的东西来加速这个过程。@Matt谢谢你的例子!这也是一个解决方案,但它与我的第一个解决方案有相同的问题。对于我在API的每一层中创建的每个抽象,我必须有一个实体和一个EntityDTO。此外,如果我需要更改Entity中的字段,我也必须在EntityDTO中更改它们:(看看这个,尝试一下,并报告结果。我也对这个问题和解决方案感兴趣:)
public class Product
{
public string Name { get; set; }
public string Category { get; set; }
public double Price { get; set; }
public DateTimeOffset DateAdded { get; set; }
}
public class IdentifiedProduct : Product
{
public Guid Id { get; set; }
}
public class IdentifiedEntity<EntityType> where EntityType : class
{
public Guid Id { get; set; }
public EntityType Entity { get; set; }
}