Sé que este tema está pasando por un tiempo y entré en una especie de la misma cuestión. Hasta ahora no pude encontrar una solución para mí que lo mantenga todo junto en un solo lugar, por lo que el código aún es legible.
Al crear un usuario, quiero que el propio objeto establezca algunos campos a través del private setters
, p. un GUID y fecha de creación y no 'contaminante' el constructor.
Mi clase Usuario:
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; }
}
Código de llamada:
context.Users.Add(User.Create(c=>
{
c.Name = "Name";
c.Email = "[email protected]";
c.Salt = salt;
c.Password = "mypass";
c.Roles = new List<Role> { adminRole, userRole };
}));
En caso de que alguien se pregunte. Termino usando 'Repository Pattern' (http://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c-sharp), estableciendo los valores predeterminados durante INSERT. Es una buena separación, ya que estoy pensando en alejarme de EF en el futuro. – Andy
+1 por "alejarse de EF en el futuro". ¡Perdí un montón de tiempo que podría haber codificado SQL para mi aplicación actual! Pero, ¿qué vas a usar? NHibernate, ¿es mejor? – Mzn