예제 #1
0
        /// <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
        }