/// <summary>Initializes a new instance of the ReflectionControllerFactory class</summary> /// <param name="controllerManager">Controller manager</param> /// <param name="resourceLibrary">Resource library</param> public ReflectionControllerFactory(IControllerManager controllerManager, IResourceLibrary resourceLibrary) { this.controllerManager = controllerManager; this.resources = resourceLibrary; var assemblies = AppDomain.CurrentDomain.GetAssemblies(); //// Log.Trace("ControllerFactory - Searching for controllers in {0} assemblies: {1}", assemblies.Length, string.Join(", ", assemblies.Select(asm => asm.FullName).ToArray())); var types = assemblies .SelectMany(asm => asm.TryGetTypes()) .Where(t => t != null && !t.IsInterface && !t.IsAbstract && typeof(IController).IsAssignableFrom(t)) .ToArray(); this.constructors = new Dictionary <string, ConstructorInfo>(); foreach (var type in types) { //// Log.Trace("ControllerFactory - Indexing type '{0}'...", type.FullName); var attr = type.GetCustomAttributes(typeof(ControllerAttribute), false) .FirstOrDefault() as ControllerAttribute; if (attr == null) { Log.Error( "Skipping '{0}': IController implementation missing required attribute '[Controller(\"controller.identifier\")]'.", type.FullName); continue; } var ctor = type.GetConstructors() .FirstOrDefault(c => c.GetParameters() .Select(p => p.ParameterType) .All(t => DefaultConstructorParameterTypes.Any(ct => ct.IsAssignableFrom(t)) || GlobalContainer.CanResolve(t))); if (ctor == null) { Log.Error( "Skipping '{0}': IController implementation did not contain any acceptable constructors.", type.FullName, type.Name, string.Join(", ", DefaultConstructorParameterTypes.Select(t => t.FullName).ToArray())); continue; } this.constructors.Add(attr.Id, ctor); } #if TRACE Log.Trace( "ControllerFactory - Indexed {0} controller types:\n\t{1}", this.constructors.Count, string.Join("\n\t", this.constructors.Select(kvp => "{0} ({1})".FormatInvariant(kvp.Key, kvp.Value.DeclaringType.FullName)).ToArray())); #endif }