Je sais que ce sujet est en cours depuis un moment et je suis entré dans une sorte de la même question. Jusqu'à présent, je ne pouvais pas trouver de solution pour que tout soit réuni au même endroit, de sorte que le code soit toujours lisible.
Lors de la création d'un utilisateur, je souhaite que certains champs soient définis par l'objet lui-même via private setters
, par exemple, un GUID et une date de création et non de "polluer" le constructeur.
Ma classe d'utilisateurs:
public class User
{
public static User Create(Action<User> init)
{
var user = new User();
user.Guid = Guid.NewGuid();
user.Since = DateTime.Now;
init(user);
return user;
}
public int UserID { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<Widget> Widgets { get; set; }
[StringLength(50), Required]
public string Name { get; set; }
[EmailAddress, Required]
public string Email { get; set; }
[StringLength(255), Required]
public string Password { get; set; }
[StringLength(16), Required]
public string Salt { get; set; }
public DateTime Since { get; private set; }
public Guid Guid { get; private set; }
}
Code d'appel:
context.Users.Add(User.Create(c=>
{
c.Name = "Name";
c.Email = "some@one.com";
c.Salt = salt;
c.Password = "mypass";
c.Roles = new List<Role> { adminRole, userRole };
}));