如何确保 .Net API Dto 中的通用负载?
How can I ensure a generic payload in a .Net API Dto?
我有一个用于创建客户组织的 DTO。
public record clientDto(string legalname, string name, string country, australianClientData payload);
public record australianClientData(int abn);
australianClientData
中的这些属性特定于澳大利亚组织。来自其他国家的组织将具有自己的特定属性。
如何确保 payload
的类型允许不同的子类型(即 usaClientData、chinaClientData)?
失败尝试 #1 - 使用基地 class
我已经尝试让 australianClientData
从基础 class parentPayload
继承。这个问题是我的控制器假设有效载荷是基数 class(空)所以它完全忽略了它。
失败的尝试 #2 - 使用通用 class
@stuartd 这是我想出的。
public record clientDto(string legalname, string name, string country);
public record clientDto<TCountry>(string legalname, string name, string country, TCountry? payload) where TCountry : parentPayload;
public abstract record parentPayload();
public record payloadAustraliaClientData(int abn, string aciclabel, string acicofficecode) : parentPayload;
[HttpPost]
public clientDto Post([FromBody] clientDto clientObject)
{
return clientObject;
}
问题是我很难 return 从我的 API 中输入正确的类型。我知道 clientDto<TCountry>
不同于 clientDto
(我的数据可以是两者之一),但我的 API 接受并且 returns clientDto
。我在 C# 方面经验不足,我不知道如何期望或 return 适当的类型。
另一种方法是使用可选属性:
public record clientData(int? abn, int? ssn);
然后让API隐式找出底层的DTO。您还可以通过枚举强类型请求:
public record clientData(ClientType type, int? abn, int? ssn);
这样 API 知道要提取哪些属性并在缺少时使请求失败。
我有一个用于创建客户组织的 DTO。
public record clientDto(string legalname, string name, string country, australianClientData payload);
public record australianClientData(int abn);
australianClientData
中的这些属性特定于澳大利亚组织。来自其他国家的组织将具有自己的特定属性。
如何确保 payload
的类型允许不同的子类型(即 usaClientData、chinaClientData)?
失败尝试 #1 - 使用基地 class
我已经尝试让 australianClientData
从基础 class parentPayload
继承。这个问题是我的控制器假设有效载荷是基数 class(空)所以它完全忽略了它。
失败的尝试 #2 - 使用通用 class
@stuartd 这是我想出的。
public record clientDto(string legalname, string name, string country);
public record clientDto<TCountry>(string legalname, string name, string country, TCountry? payload) where TCountry : parentPayload;
public abstract record parentPayload();
public record payloadAustraliaClientData(int abn, string aciclabel, string acicofficecode) : parentPayload;
[HttpPost]
public clientDto Post([FromBody] clientDto clientObject)
{
return clientObject;
}
问题是我很难 return 从我的 API 中输入正确的类型。我知道 clientDto<TCountry>
不同于 clientDto
(我的数据可以是两者之一),但我的 API 接受并且 returns clientDto
。我在 C# 方面经验不足,我不知道如何期望或 return 适当的类型。
另一种方法是使用可选属性:
public record clientData(int? abn, int? ssn);
然后让API隐式找出底层的DTO。您还可以通过枚举强类型请求:
public record clientData(ClientType type, int? abn, int? ssn);
这样 API 知道要提取哪些属性并在缺少时使请求失败。