Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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));
            }
        }