using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Aiwaz.Common { public class ObjectFactory { private Dictionary m_Patterns = new Dictionary(); private Dictionary> m_StoredObjects = new Dictionary>(); public void RegisterPattern() { var patternObject = typeof(O); var patternInterface = patternObject.GetInterface("I" + patternObject.Name); m_Patterns.Add(patternInterface, patternObject); } public void RegisterPattern() { m_Patterns.Add(typeof(I), typeof(O)); } public T CreateInstance(params object[] args) { var creationType = m_Patterns.First(argPattern => argPattern.Key == typeof(T)).Value; Type[] creationArguments = null; if (args != null && args.Length > 0) creationArguments = args.Select(arg => arg.GetType()).ToArray(); var constructor = creationType.GetConstructor(creationArguments == null ? System.Type.EmptyTypes : creationArguments); var construct = (T)constructor.Invoke(args); return construct; } public T CreateNamedInstance(string argName, params object[] args) { var construct = CreateInstance(args); var storage = m_StoredObjects.FirstOrDefault(type => type.Key == typeof(T)).Value; if (storage == null) { m_StoredObjects.Add(typeof(T), new Dictionary()); storage = m_StoredObjects.FirstOrDefault(type => type.Key == typeof(T)).Value; } storage.Add(argName, construct); return construct; } public T FindNamedInstance(string argName) { var storage = m_StoredObjects.FirstOrDefault(type => type.Key == typeof(T)).Value; if (storage == null || !storage.ContainsKey(argName)) return default(T); return (T)storage[argName]; } public void RemoveNamedInstance(string argName) { var storage = m_StoredObjects.FirstOrDefault(type => type.Key == typeof(T)).Value; if (storage == null) return; storage.Remove(argName); } } }