public ServiceDependency AsDependency(ContainerContext containerContext, string dependencyName, bool isEnumerable) { if (Status.IsBad()) { return(containerContext.ServiceError(this, dependencyName)); } if (Status == ServiceStatus.NotResolved) { return(containerContext.NotResolved(this, dependencyName)); } if (!isEnumerable) { return(Instances.Length > 1 ? containerContext.Error(this, dependencyName, FormatManyImplementationsMessage()) : containerContext.Service(this, Instances[0].Instance, dependencyName)); } return(containerContext.Service(this, GetAllValues(), dependencyName)); }
private void InstantiateInterface(ContainerService.Builder builder) { HashSet <ImplementationType> implementationTypes; try { implementationTypes = GetImplementationTypes(builder); } catch (Exception e) { builder.SetError(e); return; } ApplySelectors(implementationTypes, builder); if (implementationTypes.Count == 0) { builder.SetComment("has no implementations"); return; } Func <object> factory = null; var canUseFactory = true; foreach (var implementationType in implementationTypes) { if (implementationType.accepted) { var implementationService = ResolveCore(ServiceName.Parse(implementationType.type, InternalHelpers.emptyStrings), builder.CreateNew, builder.Arguments, builder.Context); builder.LinkTo(containerContext, implementationService, implementationType.comment); if (builder.CreateNew && builder.Arguments == null && implementationService.Status == ServiceStatus.Ok && canUseFactory) { if (factory == null) { if (!factoryCache.TryGetValue(implementationService.Name, out factory)) { canUseFactory = false; } } else { canUseFactory = false; } } if (builder.Status.IsBad()) { return; } } else { var dependency = containerContext.NotResolved(null, implementationType.type.FormatName()); dependency.Comment = implementationType.comment; builder.AddDependency(dependency, true); } } builder.EndResolveDependencies(); if (factory != null && canUseFactory) { factoryCache.TryAdd(builder.GetFinalName(), factory); } }