/// <summary> /// Initializes a new instance of the <see cref="ServiceResolveContext"/> of the /// specified <paramref name="parentContext"/>. /// </summary> /// <remarks>The depth automatically increases.</remarks> /// <param name="parentContext">the parent context to take the data from</param> /// <param name="constructionMode"></param> /// <param name="serviceType">the type of the new service being resolved</param> /// <exception cref="ArgumentNullException"> /// thrown if the specified <paramref name="parentContext"/> is <see langword="null"/>. /// </exception> /// <exception cref="ArgumentNullException"> /// thrown if the specified <paramref name="serviceType"/> is <see langword="null"/>. /// </exception> /// <exception cref="InvalidOperationException"> /// thrown if the maximum service resolve depth was exceeded. /// </exception> public ServiceResolveContext(ServiceResolveContext parentContext, ServiceConstructionMode constructionMode, Type serviceType) { if (parentContext is null) { throw new ArgumentNullException(nameof(parentContext)); } ParentType = parentContext.ServiceType; Resolver = parentContext.Resolver; Register = parentContext.Register; ServiceType = serviceType; ConstructionMode = GetServiceConstructionMode(constructionMode, parentContext.Resolver, parentContext); // increase resolve depth and check if it was exceeded if ((Depth = parentContext.Depth + 1) >= parentContext.Resolver.MaximumDepth) { throw new InvalidOperationException($"The maximum service resolve depth ({Depth}) was exceeded."); } #if DEBUG TraceBuilder = parentContext.TraceBuilder; #endif // DEBUG }
private static ServiceConstructionMode GetServiceConstructionMode(ServiceConstructionMode mode, IServiceResolver resolver, ServiceResolveContext parentContext = null) { // check if the mode is parent and the parent context is available if (mode == ServiceConstructionMode.Parent && parentContext != null) { return(parentContext.ConstructionMode); } // check if not the default mode is used if (mode != ServiceConstructionMode.Default) { // use selected mode return(mode); } // use default construction mode return(resolver.ServiceConstructionMode); }