public T GetDefault(Characteristics characteristics, string template = null) { template = template ?? DefaultTemplateName; if (characteristics == null) { throw new InvalidOperationException("Can't have a null characteristics; use Characteristics.None"); } //check for characteristics if (!CharacteristicsTransitionMethods.ContainsKey(characteristics)) { throw new Exception($"unknown characteristics:{characteristics}"); } if (!Defaults.ContainsKey(characteristics)) { Defaults.Add(characteristics, new Dictionary <string, Lazy <T> >()); } if (!Defaults[characteristics].ContainsKey(template)) { //initialize Func <T> factory = () => { var ret = ObjectFactory.CreateInstance <T>(); if (TemplateManager == null && template != null) { throw new NullReferenceException("No template manager was provided"); } if (template == DefaultTemplateName) { TemplateManager?.ApplyTemplate(ret); } else { TemplateManager?.ApplyTemplate(ret, template); } DecorateNewItem(ret); CharacteristicsTransitionMethods[characteristics](ret); return(ret); }; Defaults[characteristics].Add(template, new Lazy <T>(factory)); } return(Defaults[characteristics][template].Value); }
public void InitializeCharacteristicsTransition(Func <T, T> defaultFactory, Characteristics characteristics) { if (!CharacteristicsTransitionMethods.ContainsKey(characteristics)) { CharacteristicsTransitionMethods.Add(characteristics, defaultFactory); } else { throw new Exception($"there is already a default for characteristics:{characteristics}"); } }