簡體   English   中英

可選的Rest服務參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM