Exemplo n.º 1
0
        /// <summary>
        /// Scan for singleton types that are marked by either [Singleton] or [LazySingleton].
        /// </summary>
        public void ScanSingletonTypes()
        {
            var singletonTypes = reflection.FindTypesMarkedByAttributes(new Type[] { typeof(SingletonAttribute) });

            var singletonDefs = singletonTypes
                                .Where(type =>
            {
                return(reflection.GetAttributes <SingletonAttribute>(type).All(attr => attr.Discoverable()));
            })
                                .Select(type =>
            {
                var attrs = reflection.GetAttributes <SingletonAttribute>(type).ToArray();

                return(new SingletonDef()
                {
                    singletonType = type,
                    dependencyNames = attrs
                                      .Where(attribute => attribute.DependencyName != null)
                                      .Select(attribute => attribute.DependencyName)
                                      .ToArray(),
                    lazy = attrs.Any(atribute => atribute.Lazy),
                    Instantiate = (factory, t) => attrs.First().CreateInstance(factory, t)
                });
            })
                                .ToArray();

            logger.LogVerbose("Found singletons:");
            singletonDefs.Each(def => logger.LogVerbose("\t" + def.ToString()));

            singletonDefs
            .Each(singletonDef => singletonManager.RegisterSingleton(singletonDef));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Helper function to search for and auto-register factory types.
        /// Mockable interfaces are passed in for testing.
        /// </summary>
        public static void AutoRegisterTypes(IReflection reflection, IFactory factory)
        {
            Argument.NotNull(() => reflection);
            Argument.NotNull(() => factory);

            // Add factory creatable definitions
            var factoryCreatableTypes = reflection.FindTypesMarkedByAttributes(new Type[] { typeof(FactoryCreatableAttribute) });

            foreach (var factoryCreatableType in factoryCreatableTypes)
            {
                var attributes = reflection.GetAttributes <FactoryCreatableAttribute>(factoryCreatableType);
                foreach (var attribute in attributes)
                {
                    var name = attribute.TypeName;
                    if (string.IsNullOrEmpty(name))
                    {
                        name = factoryCreatableType.Name;
                    }

                    factory.Type(name, factoryCreatableType);
                }
            }
        }