Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#REST API-用ID字段装饰GET返回的实体 背景_C#_Rest_Design Patterns_Architecture - Fatal编程技术网

C#REST API-用ID字段装饰GET返回的实体 背景

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 问题: 如何以良好的可维护方式实现这一点 可能的解决方案 我已经确定了两种方法来实现这一点,它们不包括魔术,并且可以很好地使用自动生成的招摇过市文档

当使用者使用POST/PATCH/PUT谓词与我的RESTAPI交互时,我不想公开包含ID字段的实体。原因是API的使用者根本不应该修改此字段

但是,当使用者使用GET重试一个实体时,我希望该实体的ID被公开

示例:

本文将Product类型的实体作为参数。此产品没有ID字段,因为它将由API自动生成。在响应对象中,返回产品,包括其自动生成的ID

问题: 如何以良好的可维护方式实现这一点

可能的解决方案 我已经确定了两种方法来实现这一点,它们不包括魔术,并且可以很好地使用自动生成的招摇过市文档

第一个解决方案: 创建一个没有标识符的基类,然后创建一个继承自该基类并添加ID字段的子类

基类:

子类:

结果招摇过市:

缺点: 实际上,我将使API的每一层中的实体数量增加一倍


第二种解决方案:添加一个泛型装饰器类

通用装饰器:

公共类标识属性,其中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; }
}