ASP .NET Core API + GraphQL - dlaczego to nie jest popularne?

Odpowiedz Nowy wątek
2019-08-12 09:59
0

Witam.
Ostatnio mi się na YouTube pokazała propozycja video z konferencji na temat GraphQL i tak sobie pomyślałem, dlaczego tego się nie używa w API w ASP .NET Core? Słyszałem już o GraphQL wcześniej, ale jakoś nie miałem weny twórczej na drążenie co to i po co mi to, a teraz, jak już wiem do czego jest zdolny, dziwię się dlaczego tego nie ma w API. Rozumiem, że te zapytania są czasem bardzo skomplikowane, ale przecież do API łączą się "profesjonaliści', a nie szara pani basia z działu sprzedaży.
Czy tylko mnie się wydaje, że to połączenie mogłoby być potężne?

Pozostało 580 znaków

2019-08-12 10:38
2

GraphQL rozwiązuje problem under/over fetchingu, jeśli masz taki problem to GraphQL jest rozwiązaniem. Jeśli nie masz takiego problemu to używanie GraphQL jest czystym overengineeringiem i żaden hype ze strony reactowego community tego nie zmieni :D.


Java to taki C# tyle że z gorszą składnią.

Pozostało 580 znaków

2019-08-12 20:37
0

Serio? To tyle? Owszem wszędzie są plusy i minusy, ale dlaczego akurat GraphQL nadaje się do rozwiązania tylko problemu under/over fetchingu?

Pokaż pozostałe 2 komentarze
Z mojego 2minutowego researchu wynika, że właśnie do tego służy GQ, więc może rzeczywiście tak jest? to tak jakbyś zapytał "do czego sluzy sql" i na odpowiedz "gadania z bazą" wątpił pisząc "co? tylko tyle?" - WeiXiao 2019-08-12 21:16
Słabe porównanie, ponieważ idąc tym tokiem rozumowania to GraphQL jest do odpytywania API i sensu to nie ma jak odpowiedź z SQL. Jakiś przykład, kiedy jest under/over fetching? Do jakich danych dobry jest GraphQL, a do jakich nie? Czy to nie jest jedyny/główny problem API, który właśnie GraphQL rozwiązuje? - AdamWox 2019-08-12 21:23
Z tego co wydedukowałem, to under masz wtedy kiedy robisz X requestów po dane, bo w 1 nie wziąłeś wszystkiego, a over masz wtedy gdy pobierasz nadmiarowo. Do jakich danych? pewnie takich, gdzie często zmieniają się pojedyncze pola, nie wiem. - WeiXiao 2019-08-12 21:27
no nie da się ukryć że nie przepadam za tym rozwiązaniem :D - neves 2019-08-13 08:52
Czyli słusznie miała prawo mnie twoja odpowiedź nie satysfakcjonować :D - AdamWox 2019-08-13 09:01

Pozostało 580 znaków

2019-08-12 21:58
0

Czym się różni GraphQL od dynamic linq na expressionach?

Korzystając trochę z kodu @Juhas na expr from str. oraz ukradniętego z SO kodu na zamiane string to func

Wyszło mi, że możemy sobie dynamicznie definiować Select oraz Where

Jedyne problemy jakie tutaj zauważyłem to:

  • Jeżeli pomijamy jakąś kolumnę, to chyba wstawi się tam wartość default, więc trzeba byłoby ? porobić albo po prostu poprawnie obsłużyć po stronie frontu, który w sumie sam sobie wybiera co chcę dostać, więc raczej nie ma problemu.

  • Wygenerowanie Expression z stringa to nie jest tania operacja

Output:

var dynamicSelect = "Id,Name";
1
null
Name321

2
null
Name123

2
234
Name123

var dynamicSelect = "Id,Age";
1
155

2
234

2
234
Name123
public class Test
{
    public int Id { get; set; }
    public int? Age { get; set; }
    public string Name { get; set; }
}

public static void Main()
{
    var opt = new DbContextOptionsBuilder<Context>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
    var context = new Context(opt);
    context.Add(new Test { Id = 0, Age = 155, Name = "Name321" });
    context.Add(new Test { Id = 2, Age = 234, Name = "Name123"});
    context.SaveChanges();

    var dynamicSelect = "Id,Name";

    var result = context.Tests.Select(CreateNewStatement<Test>(dynamicSelect)).ToList(); // count = 2

    var expr = ExpressionFromStr<Test>("x => x.Age % 2 == 0").Result;

    var result2 = context.Tests.Where(expr).ToList(); // count = 1

    foreach (var test in result.Union(result2))
    {
        Console.WriteLine(test.Id);
        Console.WriteLine(test.Age?.ToString() ?? "null"); // aby ładniej wyświetlić
        Console.WriteLine(test.Name);
        Console.WriteLine();
    }
}

public async static Task<Expression<Func<T, bool>>> ExpressionFromStr<T>(string expressionStr)
{
    var options = ScriptOptions.Default.AddReferences(typeof(T).Assembly);
    return await CSharpScript.EvaluateAsync<Expression<Func<T, bool>>>(expressionStr, options);
}

public static Func<T, T> CreateNewStatement<T>(string fields)
{
    var xParameter = Expression.Parameter(typeof(T), "o");

    var xNew = Expression.New(typeof(T));

    var bindings = fields.Split(',').Select(o => o.Trim()).Select(o =>
    {
            var mi = typeof(T).GetProperty(o);
            var xOriginal = Expression.Property(xParameter, mi);
            return Expression.Bind(mi, xOriginal);
        }
    );

    var xInit = Expression.MemberInit(xNew, bindings);
    var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter);
    return lambda.Compile();
}
edytowany 12x, ostatnio: WeiXiao, 2019-08-12 22:10

Pozostało 580 znaków

2019-08-13 19:42
0

Może się mylę ale przyglądając się graphql wygląda to jak by dac dostęp do całej bazy danych każdemu kto korzysta z aplikacji. Każdy z wiedzą będzie w stanie generować swoje zapytania z konsoli przeglądarki.

Pozostało 580 znaków

2019-08-13 20:26
0

No tak, z tym wyjątkiem, że nie trzeba pisać tego co wcześniej napisał @WeiXiao. Oczywiście nie udostępniasz API bez autoryzacji, więc nie mając tokena, nie masz tej władzy.

Pozostało 580 znaków

2019-08-13 20:32
1
liwaskiewicz napisał(a):

Może się mylę ale przyglądając się graphql wygląda to jak by dac dostęp do całej bazy danych każdemu kto korzysta z aplikacji. Każdy z wiedzą będzie w stanie generować swoje zapytania z konsoli przeglądarki.

Zapytania do API a nie do bazy, Więc pod względem bezpieczeństwa nic się nie zmienia. Jeśli API nie wystawia konkretnych danych to GraphQL nie zdziała tu cudów i dostępu do tych danych mieć nie będzie.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0