[英]Optional Rest service parameters
昨天我遇到了一個問題。 我被要求編寫一個REST服務,該服務公開一個類的所有屬性。 消費者都將消費不同的屬性,並且在提交時,他們都會發送它們的不同子集。 例如,緣故讓我們致電合同公司。
class Company{
public string Address {get;set;}
public string CompanyNumber {get;set;}
public string Turnover {get;set;}
public string Employees {get;set;}
}
可以說我們有兩個已知的系統要同步Company類。 系統1處理記帳,並且想要閱讀地址和更新周轉率。 系統2處理hr,並希望讀取地址並更新員工。 現在通常面對這個問題時,人們會寫很多接口,每個接口都帶有適合最終系統的量身定制的合同。 但是,有人告訴我這不是他們想要的。 相反,如果該屬性在JSON中提供,則必須對其進行設置。
問題是,如果未提供該屬性,則從JSON反序列化Company類時,該屬性為null,則在映射到數據庫類時,它將覆蓋數據。
我想到的解決方案是創建一個像Nullable這樣的Optional結構,但其中null也可以是一個有效值。 反序列化時,此結構可以跟蹤是否設置了屬性,因此可以在JSON中提供。 然后,我可以在從DTO映射到數據庫類時進行檢查,並且僅在設置屬性時進行映射。:)
https://dotnetfiddle.net/QmHtSW
public interface IOptional
{
bool HasBeenSet { get; }
}
public struct Optional<T> : IOptional
{
internal readonly T Val;
public Optional(T value)
{
Val = value;
HasBeenSet = true;
}
public Optional(Optional<T> value)
{
Val = value.Value;
HasBeenSet = value.HasBeenSet;
}
public bool HasBeenSet { get; }
public override bool Equals(object obj)
{
return obj.Equals(Val);
}
public override int GetHashCode()
{
return Val.GetHashCode();
}
public static implicit operator T(Optional<T> optional)
{
return optional.Val;
}
public static implicit operator Optional<T>(T optional)
{
return new Optional<T>(optional);
}
public T Value => Val;
}
和我的AutoMapper映射配置文件
CreateMap<TRestObject, TDomainObject>()
.ForAllMembers(mo=>mo.Condition(f =>
{
var opt = f.SourceValue as IOptional;
return opt==null || opt.HasBeenSet;
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.