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_ruleItems = new List (); // broken rules public string Name { get; set; } public string Area { get; set; } public int Age { get; set; } public string Email { get; set; } public List 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 GetRuleItems(Member member); } public class EooRule : Rule { public override string Area => "Eoo"; public override IEnumerable GetRuleItems(Member member) { var ruleItems = new List (); 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 GetRuleItems(Member member) { var ruleItems = new List (); if (string.IsNullOrEmpty(member.Email)) { ruleItems.Add("Foo member must have an email"); } return ruleItems; } } public class RuleFactory { private static readonly List _rules = new List { new EooRule(), new FooRule() }; public static Rule GetRule(string area) { return _rules.FirstOrDefault(v => v.Area == area); } }}