Immutable Value Object przesyłany/serializowany (np po SignalR)

Najbardziej popularnym Value Object jest Money. Dzisiejsza implementacja jest okrojona, bo chciałbym pokazać tylko jedną rzecz. W tym przykładzie instancje możemy tworzyć tylko poprzez metode Create() (taka fabryka). Konstruktor jest prywatny.

public class Money
{
    public static Money Create(decimal value, string currency)
    {
        // some additional checks
        return new Money(value, currency);
    }

    Money(decimal value, string currency)
    {
        Value = value;
        Currency = currency;
    }

    public decimal Value { get; }
    public string Currency { get; }
}

Pewnie dla tego przykładu lepiej mieć po prostu publiczny konstruktor z dwoma parametrami, ale mam wiele przykładów innych bardziej skomplikowanych Value Objects, gdzie podejście z prywatnym konstruktorem i kilkoma fabrykami walidującymi różne przypadki ma sens.

Czy można przesyłać immutable Value Object poprzez SignalR?

Taki obiekt nie przejdzie serializacji JsonSerializerem i nie może być przesłany SignalR’em. Uważam, że nie ma nic złego w przesyłaniu takiego immutable Money między clientem a serverem (obydwa w .NET, nie tylko webem żyje człowiek 😉 ). Czy ktoś uważa, że to złe podejście i trzeba tworzyć do tego DTO? Postawiłem na prostotę.

Rozwiązanie

Trzeba dodać attrybut [JsonConstructor] do konstruktora.

public class Money
{
    public static Money Create(decimal value, string currency)
    {
        // some additional checks
        return new Money(value, currency);
    }

    [JsonConstructor]
    Money(decimal value, string currency)
    {
        Value = value;
        Currency = currency;
    }

    public decimal Value { get; }
    public string Currency { get; }
}

Źródło: JSON.net: how to deserialize without using the default constructor?

Jak testować/rozkminiać takie rzeczy

Szlak by mnie trafił gdybym miał takie moje przemyślenia, przypuszczenia, POC testować na żywym projekcie, który się ileś tam uruchamia i potem muszę jeszcze sie przeklikać, żeby coś wywołać.

Izolujemy co istotne od tego co nieistotne i testujemy 🙂

Advertisements
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

2 odpowiedzi na „Immutable Value Object przesyłany/serializowany (np po SignalR)

  1. Mario K pisze:

    Moze byc konstruktor private?

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s