/// <summary> /// Tries the automatic registration. /// </summary> /// <param name="type">The type.</param> /// <returns></returns> /// <exception cref="TooManyImplementationsException">Thrown when more than one implementation is available for the same type</exception> private static object TryAutoRegistration(Type type) { var types = TypesCache .Where(t => !t.IsAbstract && type.IsAssignableFrom(t) && t.GetConstructors().Any(c => !c.GetParameters().Any())) .ToList(); if (types.Count == 0) { return(null); } if (types.Count > 1) { throw new TooManyImplementationsException(type); } var instance = GetInstance(types.Single()); Registrations.AddOrUpdate(type, () => instance, (key, existingVal) => () => instance); return(instance); }
/// <summary> /// Get all instances for a contract /// </summary> /// <param name="contract"></param> /// <returns></returns> private static IEnumerable <object> GetAllInstances(Type contract) { if (!Instances.ContainsKey(contract)) { lock (Locks.GetOrAdd(contract.FullName ?? contract.Name, new object())) { if (!Instances.ContainsKey(contract)) { Instances.TryAdd(contract, TypesCache.Where(t => contract.IsAssignableFrom(t) && !t.IsAbstract).ToList()); } } } if (!Instances.TryGetValue(contract, out var types)) { yield break; } foreach (var type in types) { yield return(GetInstance(type)); } }