このトピックがしばらく続いていることは知っていますが、ある種の同じ問題に遭遇しました。これまでのところ、すべてを 1 か所にまとめてコードを読めるようにする解決策を見つけることができませんでした。
private setters
ユーザーの作成時に、コンストラクターを「汚染」せずに、GUID と作成日など、オブジェクト自体によっていくつかのフィールドを設定したいと考えています。
私のユーザークラス:
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; }
}
呼び出しコード:
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 };
}));