/// <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)); }
/// <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); } } }