我有一个创建客户组织的DTO。
public record clientDto(string legalname, string name, string country, australianClientData payload);
public record australianClientData(int abn);
australianClientData
中的这些属性是澳大利亚组织特有的。来自其他国家的组织将有自己的特定属性。
如何确保payload
是允许不同子类型(即usaClientData、chinaClientData(的类型?
失败的尝试#1-使用基类
我已经尝试过让australianClientData
从基类parentPayload
继承。问题是,我的控制器假设有效载荷是基类(空(,所以它完全忽略了它。
尝试#2失败-使用泛型类
@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;
}
问题是我很难从API返回正确的类型。我知道clientDto<TCountry>
与clientDto
不同(我的数据可以是任意一种(,但我的API接受并返回clientDto
。我在C#方面经验不足,不知道如何期望或返回合适的类型。
另一种选择是使用可选属性:
public record clientData(int? abn, int? ssn);
然后让API隐式地找出底层DTO。您也可以通过枚举强烈键入请求:
public record clientData(ClientType type, int? abn, int? ssn);
通过这种方式,API知道要提取哪些属性,并在它们丢失时使请求失败。