Dire che sto sviluppando un bug tracker, in cui un ticket appartiene a al massimo una pietra miliare, e una pietra miliare può avere molti ticket. Quando una milestone viene cancellata (dal database), tutti i ticket associati a tale milestone devono avere la loro relazione non impostata (cioè impostata su null
). Questa è una relazione semplice.
Le classi sono abbastanza semplici e si collegano direttamente a un database:
public class Ticket {
public ObjectId Id { get; set; }
public string Title { get; set; }
public ObjectId MilestoneId { get; set; }
}
public class Milestone {
public ObjectId Id { get; set; }
public string Title { get; set; }
}
Ora arriva la parte difficile: dove e come faccio a ripristinare i campi MilestoneId
? Una possibile soluzione è scrivere un livello di accesso ai dati creando una classe gigante con tutti i metodi di accesso ai dati per tutti i tipi di oggetti, in questo caso biglietti e pietre miliari. Un'altra possibile soluzione è scrivere diverse classi (ad esempio TicketProvider
e MilestoneProvider
), una per ciascun tipo di oggetto, che fornisce metodi di accesso ai dati come Find
, Save
e Destroy
.
Quest'ultimo mi attrae di più perché non mi piacciono le classi mostruose, ma c'è un avvertimento: il metodo che cancella le pietre miliari deve reimpostare MilestoneId
s di tutti i ticket associati a null
. Ciò significa che MilestoneProvider
, che è responsabile della manipolazione delle pietre miliari, si occupa improvvisamente di biglietti!
In che modo le relazioni vengono comunemente trattate nei livelli di accesso ai dati e in che modo è possibile prevenire la violazione di SRP? Devo inserire l'intero DAL in una classe, o dovrei separarlo e, in caso affermativo, come posso farlo meglio?