Web API: classi forti o dinamiche?

1

Il mio metodo web API dovrebbe restituire alcuni dati strutturati sul mio profilo. Per farlo ho creato le seguenti classi POCO:

public class ProfileInfo
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    //....

    public ProfileAddress Address { get; set; }
    public ProfileDriverLicense DriverLicense { get; set; }
    public ProfileEmergency Emergency { get; set; }
    public ProfileEmployment Employment { get; set; }
    public ProfileCompensation Compensation { get; set; }
    public ProfileFuel Fuel { get; set; }
    public ProfileCompanyInfo CompanyInfo { get; set; }
}

public class ProfileAddress
{
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
}

public class ProfileDriverLicense
{
    //....
}

public class ProfileEmergency
{
    //....
}

public class ProfileEmployment
{
    //....
}

public class ProfileCompensation
{
    //....
}

public class ProfileFuel
{
    //....
}

public class ProfileCompanyInfo
{
    //....
}

Quindi, come puoi vedere, ci sono molte classi POCO che si annidano l'una con l'altra.

metodo di servizio, che riempie e restituisce l'oggetto ProfileInfo:

    public ProfileInfo GetProfile(string username)
    {
        var profile = _db.Drivers.Where(p => p.AspNetUser.UserName == username).Select(k => new ProfileInfo()
        {
            FirstName = k.AspNetUser.FirstName,
            LastName = k.AspNetUser.LastName,
            Username = username,
            Address = new ProfileAddress()
            {
                Address = k.StreetAddress,
                City = k.City,
                State = k.State,
                Zip = k.ZIP
            },
            AvatarUrl = k.AvatarUrl,
            CompanyInfo = new ProfileCompanyInfo()
            {
                //....
            },
            Compensation = new ProfileCompensation()
            {
                //....
            },
            DateOfBirth = k.DOB,
            DriverLicense = new ProfileDriverLicense()
            {
                //....
            },
            Email = k.AspNetUser.UserName,
            Emergency = new ProfileEmergency()
            {
                //....
            },
            Employment = new ProfileEmployment()
            {
                //....
            },
            Fuel = new ProfileFuel()
            {
                //....
            },
            Phone = k.PhoneNo,
            SSN = k.SSN,
            Notes = k.Notes,
            Truck = (k.Truck != null) ? k.Truck.TruckNo : null,
            Trailer = (k.Trailer != null) ? k.Trailer.TrailerNo : null
        }).FirstOrDefault();

        if (profile == null)
            throw new Domain.InvalidDriverException(username);

        return profile;
    }

e metodo WebAPI:

    [HttpGet]
    [Route("MyProfile")]
    public HttpResponseMessage GetProfile()
    {
        string username = GetUsernameFromClaims();
        if (String.IsNullOrWhiteSpace(username))
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "User not found");

        var profile = _serviceDriver.GetProfile(username);
        return Request.CreateResponse<Domain.POCO.Profile.ProfileInfo>(profile);
    }

funziona e funziona bene Ma qualche vantaggio nell'uso delle lezioni POCO è concreto in questo caso? O posso usare dinamico e avere lo stesso effetto, con molto meno codice e senza svantaggi? Con la dinamica non devo scrivere tutte queste classi POCO e molto facile da modificare. Capisco, quella dinamica funziona molto lentamente, non è facile trovare errori (nessun errore di compilazione), ma nel risultato API Web restituisce JSON, che non è di tipo strong per impostazione predefinita. Che senso creare e utilizzare le classi POCO?

PS. Uso i tipi forti, è più comodo per me :) Ma probabilmente per caso concreto scrivo molto extra-code?

    
posta user285336 21.03.2018 - 15:19
fonte

2 risposte

4

Il vantaggio di avere un valore di ritorno strongmente tipizzato è che puoi avere un documento descrittivo (ad esempio swagger utilizzando Swashbuckle ) che consente alle persone di generare automaticamente un client per la propria API.

Se restituisci dati JSON che non sono documentati come sono, non solo devi costruirlo dinamicamente senza un gran numero di errori di verifica sulla tua parte, il client non avrà modo di sapere come sarà. Quindi questa è una prova ed un errore su entrambi lati.

    
risposta data 21.03.2018 - 16:54
fonte
1

Hai ragione nel fatto che c'è un piccolo vantaggio per l'oggetto POCO strongmente tipizzato nel livello di hosting.

In effetti, anche se sono un sostenitore dell'uso della tipizzazione strong, sarei felice di utilizzare la dinamica per creare nuovi oggetti tipo Richiesta / Risposta che avvolgono in modo mero alcuni parametri ai fini della serializzazione.

Tuttavia! I tipi forti hanno uno scopo nel tuo livello di servizio. es. verifica errori di tempo di compilazione ecc., che è dove li costruisci.

Inoltre, mi aspetto che tu fornisca una libreria client alla tua API, dove, ancora una volta, utilizzi gli stessi tipi forti e l'interfaccia del tuo livello di servizio ha molti vantaggi.

    
risposta data 21.03.2018 - 18:40
fonte

Leggi altre domande sui tag