Sto cercando di decidere quale sia l'approccio migliore per creare un'istanza di una particolare classe. Fondamentalmente ci sono due casi d'uso: istanziarlo per salvare una nuova voce nel database e recuperare una voce esistente dal database (e magari modificare la voce recuperata e salvarla nel database).
Il problema che sto avendo ora è che non riesco a decidere quale meccanismo di istanziazione di quella classe e popolamento dei suoi campi da scegliere. Dì che ho questa classe
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
E qui ci sono gli usi. Se vuoi recuperare uno studente per il database, il codice ha un aspetto simile a:
Student student = MyLibrary.GetStudent(id);
E se vuoi creare un nuovo studente e aggiungerlo al database:
Student student = new Student();
student.FirstName = "James";
student.LastName = "Jackson";
// etc
MyLibrary.CreateStudent(student);
L'enorme problema con questo approccio è che tutti i setter sono pubblici e io assolutamente non lo voglio. Ma allo stesso tempo voglio che l'utente sia in grado di popolare liberamente la maggior parte dei campi Student
(forse con l'eccezione di Id
.
Penso che il modello di builder possa essere impiegato qui. In questo modo posso mantenere privati i setter e costringere l'utente a creare studenti di sola lettura tramite i costruttori. Tuttavia diventa davvero imbarazzante se l'utente desidera aggiornare un campo e salvarlo nel database:
var student = MyLibrary.GetStudent(id);
var newStudent = new Student.Builder(id).FirstName("NewFirstName").LastName(student.LastName)...etc...Build();
MyLibrary.CreateStudent(newStudent);
Fondamentalmente il mio unico problema con l'approccio del builder è che il codice può diventare piuttosto noioso e noioso se si desidera aggiornare una voce esistente. Alcune delle classi che ho possono avere circa 10 campi e non è bello dover copiare 9 dei campi e aggiornarne uno. Ma potrebbe essere molto più bello di avere una classe con i setter pubblici.
Quali altre opzioni ho?