/// <summary> /// Carries out the registration against the container. /// </summary> /// <param name="builder"></param> /// <param name="type"></param> /// <param name="attribute"></param> /// <param name="builders"></param> protected virtual void Register( ContainerBuilder builder, Type type, IRegistrationRootAttribute attribute, IEnumerable <IRegistrationBuilderAttribute> builders) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } if (attribute == null) { throw new ArgumentNullException(nameof(attribute)); } if (builders == null) { throw new ArgumentNullException(nameof(builders)); } // root is itself a builder add it to builder list if (attribute is IRegistrationBuilderAttribute a) { builders = builders.Append(a); } // core registration method with final set of builders RegisterCore(builder, type, attribute, builders); }
/// <summary> /// Carries out the registration against the container and applies the builders. /// </summary> /// <param name="builder"></param> /// <param name="type"></param> /// <param name="attribute"></param> /// <param name="builders"></param> protected virtual void RegisterCore( ContainerBuilder builder, Type type, IRegistrationRootAttribute attribute, IEnumerable <IRegistrationBuilderAttribute> builders) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } if (attribute == null) { throw new ArgumentNullException(nameof(attribute)); } if (builders == null) { throw new ArgumentNullException(nameof(builders)); } if (type.GetTypeInfo().IsGenericType) { ApplyBuilders(type, builder.RegisterGeneric(type), attribute, builders); } else { ApplyBuilders(type, builder.RegisterType(type), attribute, builders); } }
/// <summary> /// Applies the detected set of builders. /// </summary> /// <typeparam name="TLimit"></typeparam> /// <typeparam name="TActivatorData"></typeparam> /// <typeparam name="TRegistrationStyle"></typeparam> /// <param name="type"></param> /// <param name="builder"></param> /// <param name="attribute"></param> /// <param name="builders"></param> /// <returns></returns> protected virtual IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> ApplyBuilders <TLimit, TActivatorData, TRegistrationStyle>( Type type, IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> builder, IRegistrationRootAttribute attribute, IEnumerable <IRegistrationBuilderAttribute> builders) { if (type == null) { throw new ArgumentNullException(nameof(type)); } if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (attribute == null) { throw new ArgumentNullException(nameof(attribute)); } if (builders == null) { throw new ArgumentNullException(nameof(builders)); } // apply each builder in order foreach (var b in builders.Distinct()) { builder = b.Build(type, builder); } return(builder); }
protected override void RegisterCore( ContainerBuilder builder, Type type, IRegistrationRootAttribute attribute, IEnumerable <IRegistrationBuilderAttribute> builders) { if (attribute is RegisterConfigurationAttribute a) { ApplyBuilders(type, builder.RegisterConfigurationBinding(type, a.Path), attribute, builders); } }