using System;
using System.Collections.Generic;
using System.Linq;
namespace Validation // include rules in the domain that may vary from instance to instance
{
class Program
{
static void Main(string[] args)
{
var memberEoo = new Member { Name = "EooName", Area = "Eoo", Age = 15, Email = string.Empty }; // Eoo member must be at least 18
foreach (var item in memberEoo.Validate())
{
Console.WriteLine(item);
}
var memberFoo = new Member { Name = "FooName", Area = "Foo", Age = 15, Email = string.Empty }; // Foo member must have an email
foreach (var item in memberFoo.Validate())
{
Console.WriteLine(item);
}
}
}
public class Member // domain model
{
private readonly List<string> _ruleItems = new List<string>(); // broken rules
public string Name { get; set; }
public string Area { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public List<string> Validate()
{
if (string.IsNullOrEmpty(Name))
{
_ruleItems.Add("member must have a name");
}
if (string.IsNullOrEmpty(Area))
{
_ruleItems.Add("member must have an area");
}
else
{
_ruleItems.AddRange(RuleFactory.GetRule(Area).GetRuleItems(this)); // specific rules
}
return _ruleItems;
}
}
public abstract class Rule
{
public abstract string Area { get; }
public abstract IEnumerable<string> GetRuleItems(Member member);
}
public class EooRule : Rule
{
public override string Area => "Eoo";
public override IEnumerable<string> GetRuleItems(Member member)
{
var ruleItems = new List<string>();
if (member.Age < 18)
{
ruleItems.Add("Eoo member must be at least 18");
}
return ruleItems;
}
}
public class FooRule : Rule
{
public override string Area => "Foo";
public override IEnumerable<string> GetRuleItems(Member member)
{
var ruleItems = new List<string>();
if (string.IsNullOrEmpty(member.Email))
{
ruleItems.Add("Foo member must have an email");
}
return ruleItems;
}
}
public class RuleFactory
{
private static readonly List<Rule> _rules = new List<Rule>
{
new EooRule(),
new FooRule()
};
public static Rule GetRule(string area)
{
return _rules.FirstOrDefault(v => v.Area == area);
}
}
}