Pewna strona udostępnia api, dzięki któremu możemy pobrać informacje o konkretnym użytkowniku. Wynik dostajemy w formacie JSON
, który zawiera informacje takie jak: id, nick, data rejestracji itd. Przykład:
{"id":100,"nick":"foo","registered_at":"2017-08-19 17:55:04"}
Stworzyłem więc klasę User
, która odpowiada wynikowi JSON
.
public class User {
public int id {get; set;}
public string nick {get; set;}
public DateTime registeredAt {get; set;}
public static User FromId(int id) {
RestClient apiClient = new RestClient("https://api.site.com");
RestRequest scrapeRequest = new RestRequest("/users/" + id);
string response = apiClient.Execute(scrapeRequest).Content;
return User.FromJson(response);
}
public static User FromJson(string json) {
return JsonConvert.DeserializeObject<User>(json);
}
}
Jak widać w kodzie powyżej dodałem też metodę FromId
, której parametrem jest id
użytkownika a zwracany jest obiekt z wypełnionymi właściwościami na podstawie wyniku JSON
.
Dodałem kolejką klasę: Account
public class Account : User {
public string Email {get; private set;}
public string Password {get; private set;}
private CookieContainer Cookie = new CookieContainer();
public Account(string email, string password) {
this.Email = email;
this.Password = password;
}
public bool Login() {
//zaloguj sie i zaktualizuj ciasteczka
}
}
Account
dziedziczy po User
, co wydaje się być logiczne. Jednak pomimo, że znałbym id konkretnego obiektu Account
nie mam zbytnio możliwości, by zaktualizować dane obiektu Account
używając metody FromId
.
Będąc zalogowany i wykonując żądanie https://api.site.com/users/me
otrzymuję JSON
z informacją o mnie, czyli zalogowanym użytkowniku. Jednak sposób w jaki ja tworzę obiekt na podstawie JSON
opiera się na tym, że serializuję string w obiekt. Nie zrobię przecież coś takiego:
Mógłbym dodać taką metodę w klasie Account
:
public void UpdateDetails() {
RestClient apiClient = new RestClient("https://api.site.com");
RestRequest scrapeRequest = new RestRequest("/users/me");
string response = apiClient.Execute(scrapeRequest).Content;
User myAcc = User.FromJson(response);
this.id = myAcc.id;
this.nick = myAcc.nick;
this.registeredAt = myAcc.registeredAt;
}
Jednak takie rozwiązanie wydaje mi się słabe. W rzeczywistości nie musiałbym przepisać 3 właściwości, ale o wiele więcej. Jak więc to powinno wyglądać?
Mam jeszcze wątpliwości co do kilku rzeczy:
Używając generatorów json -> class tworzą one właściwości publiczne z publicznym set
. Czy nie powinno być tak, że set
powinno być private
/protected
?
Owe generatory stworzyły mi właściwości z małej litery. Nie powinne być one z wielkiej?
Co uważacie o tym kodzie? Co możnaby zrobić lepiej?