Voglio chiedere ad esperti sviluppatori e architetti di software su questa classe di dominio che ho trovato un giorno in qualche codice.
public class User : Entity
{
public virtual string Firstname { get; set; }
public virtual string Lastname { get; set; }
public User(string firstName, string lastName, IUserRepository userRepository, IUserService userService)
{
Firstname = firstName;
Lastname = lastName
userRepository.Save(this);
userService.DoSomeStaff(this);
}
}
Cosa pensi dei principi SOLID in particolare per quanto riguarda il costruttore? Penso che rompa almeno il principio della singola responsabilità, perché:
- il costruttore inizializza l'oggetto e
- salva l'oggetto nel DB utilizzando un repository e
- fa cose usando un servizio.
Forse c'è qualche architettura di progetto che consiglia questo stile di codice?
Ecco le definizioni per il repository e il servizio coinvolti:
public class UserRepository : IUserRepository
{
// some code of repository pattern with Nhibernate
public void Save(User user)
{
//here Session is Nhibernate.ISession
Session.SaveOrUpdate(user);
}
}
public class UserService : IUserService
{
private readonly ISomeName1Repository _someName1Repository;
private readonly ISomeName2Repository _someName2Repository;
public UserService(ISomeName1Repository someName1Repository, ISomeName2Repository someName2Repository)
{
_someName1Repository = someName1Repository;
_someName2Repository = someName2Repository;
}
public void DoSomeStaff(User user)
{
var foo = _someName1Repository.DoSomeStaff();
// some work here with user
}
}