diegodfsd
2/29/2016 - 7:17 PM

user.cs

public class User {
	public string Username { get; private set; }	
	
	public string Email{ get; private set; }
	
	public string Password { get; private set; }
	
	public BrokenRules BrokenRules { get; private set; }
	
	///EF
	protected User() {}
	
	private User(string username, string email, string password) {
		Username = username;
		Email = email;
		Password = password;
		
		BrokenRules = new UserCreateRule(this).Validate();
	}
	
	
	public void ChangeEmail(string email) {
		Email = email;
		
		BrokenRules = new ChangeEmailRule(this).Validate();
	}
	
	public class Factory {
		public static User New (string username, string email, string password){
			var instance = new User(username, email, password);
			
			return instance;
		}
	} 
}

public class UsersController {
	public IHttpActionResult Create() {
		var result = User.Factory.New("diego.dias", "diego.dfsd@gmail.com", "password1234");
		if (result.BrokenRules.HasError)
			return result.BrokenRules.Rules;
			
		return result;
	}
}


public class UserCreateRule : Rule {
	public UserCreateRule(User user) {
		User = user;
	}
	
	protected IEnumerable<BrokenRule> Validate(){
		yield return AssertationConcern.IsNull(user, "invalid_params", "User cannot be null.");
		yield return AssertationConcern.IsEmpty(user.Username, "invalid_params", "Username cannot be null or empty.");
		yield return AssertationConcern.IsEmpty(user.Email, "invalid_format", "Email has an invalid value.");
	}
}

public class BrokenRules {
	public IEnumerable<BrokenRule> Rules{ get; private set; }

	public bool HasError { get { return Rules.Any(); } }
	
	public BrokenRules(IEnumerable<BrokenRule> rules) {
		BrokenRules = rules;
	}
}

public class BrokenRule {
	public string ErrorCode { get; private set; }
	public string ErrorMessage { get; private set; }
	
	public BrokenRule(string errorCode, string errorMessage) {
		ErrorCode = errorCode;
		ErrorMessage = errorMessage;
	}
}
public class User {
	public string Username { get; private set; }	
	
	public string Email{ get; private set; }
	
	public string Password { get; private set; }
	
	///EF
	protected User() {}
	
	private User(string username, string email, string password) {
		Username = username;
		Email = email;
		Password = password;
	}
	
	
	public class Factory {
		public static Result<User> New (string username, string email, string password){
			var instance = new User(username, email, password);
			var rule = new UserCreateRule(instance);
			var brokenRules = rule.Validate();
			
			return new Result(instance, brokenRules);
		}
	} 
}

public class UsersController {
	public IHttpActionResult Create() {
		var result = User.Factory.New("diego.dias", "diego.dfsd@gmail.com", "password1234");
		if (result.HasError())
			return result.BrokenRules;
			
		return result.instance;
	}
}


public class UserCreateRule : Rule {
	public UserCreateRule(User user) {
		User = user;
	}
	
	protected IEnumerable<BrokenRule> Validate(){
		yield return AssertationConcern.IsNull(user, "invalid_params", "User cannot be null.");
		yield return AssertationConcern.IsEmpty(user.Username, "invalid_params", "Username cannot be null or empty.");
		yield return AssertationConcern.IsEmpty(user.Email, "invalid_format", "Email has an invalid value.");
	}
}

public class  {
}

public class BrokenRule {
	public string ErrorCode { get; private set; }
	public string ErrorMessage { get; private set; }
	
	public BrokenRule(string errorCode, string errorMessage) {
		ErrorCode = errorCode;
		ErrorMessage = errorMessage;
	}
}

public class Result<T> Where T : class {
	public T Instance { get; private set; }

	public IEnumerable<BrokenRule> BrokenRules { get; private set; }

	public bool HasError { get { return BrokenRules.Any(); } }
	
	public Result(T instance, IEnumerable<BrokenRule> rules) {
	public Result(T instance, IEnumerable<BrokenRule> rules) {
		Instance = data;
		BrokenRules = rules;
	}
}