Supponiamo di avere una relazione molti a molti nel database come questa:
CREATE TABLE Person (ID int, name varchar(100), dateofbirth datetime, Gender char(1), primary key (ID))
CREATE TABLE Sport (ID int, description varchar(30), primary key (ID))
CREATE TABLE PersonCanPlaySport (Person ID int references Person(ID), SportID int references Sport(ID), PRIMARY KEY (SportID, PersonID))
Le tabelle mostrano a quale sport può partecipare una persona. Ora guarda la classe qui sotto:
public class Person
{
public List<Sport> Sports;
public int FitnessLevel;
public datetime DateOfBirth;
public string Gender; //M or F
public Person()
{
Sports = new List<Sport>();
}
//allSports contains all the sports from the database i.e. allSports contains about 100 sports. AddSports determines what sports (out of the 100) that the user can participate in based on: Gender, age, Fitness Level etc
public void AddSports(List<Sports> allSports)
{
Sports.Clear();
((List<Sport>)Sports).AddRange(allSports
.Where(sport => sport.CanPlay(this)));
}
}
Sembra esserci una relazione di associazione e una relazione di composizione tra persona e sport. Ecco perché:
1) La persona crea un'istanza di un elenco di sport nel costruttore, quindi controlla il ciclo di vita degli sport 2) La persona usa una lista di sport in AddSports, che credo lo renda associazione
È un odore di codice? Che tipo di relazione esiste tra i due oggetti? Come sarebbe rappresentato su un Object Diagram?
Aggiorna
In seguito alla risposta e ai commenti utili di @Neil; Credo che stia suggerendo di fare questo:
//Application Service Layer
List<Sport> sports = Repository.GetAllOffers();
foreach sport As Sport in sports
{
person.AddSports(sport);
}
//Domain class
public class Person
{
public List<Sport> Sports;
public int FitnessLevel;
public datetime DateOfBirth;
public string Gender; //M or F
public Person()
{
Sports = new List<Sport>();
}
public void AddSport(Sport sport)
{
if(sport.CanPlay(this))
{
Sports.Add(sport);
}
}
}
Non sono sicuro che mi piaccia l'idea che il livello del servizio di applicazione debba scorrere su Sport.