private static ContainerBuilder BindType <TService, TImplementation>(ContainerBuilder builder, Action <IBindingBuilder> composeAction) { TypeInfo serviceType = typeof(TService).GetTypeInfo(); TypeInfo implementationType = typeof(TImplementation).GetTypeInfo(); if (serviceType.IsGenericTypeDefinition) { if (!implementationType.IsGenericTypeDefinition || serviceType.GetGenericArguments().Length != implementationType.GetGenericArguments().Length) { throw new BindingInvalidException("Generic service types must have a generic implementation with matching argument count."); } IGenericBindingBuilder <TService> genericBindingBuilder = new GenericTypeBindingBuilder <TService, TImplementation>(builder); composeAction?.Invoke(genericBindingBuilder); builder.WithGenericBindingBuilder(genericBindingBuilder); } else { IBindingBuilder bindingBuilder = new TypeBindingBuilder <TService, TImplementation>(builder); composeAction?.Invoke(bindingBuilder); builder.WithBindingBuilder(bindingBuilder); } return(builder); }
public IContainer Bind(Type serviceType, Type implementationType, Action <IBindingBuilder> composeAction = null) { TypeInfo serviceTypeInfo = serviceType.GetTypeInfo(); TypeInfo implementationTypeInfo = implementationType.GetTypeInfo(); if (serviceTypeInfo.IsGenericTypeDefinition) { IGenericBindingBuilder genericBuilder = new GenericTypeBindingBuilder(this, serviceType, implementationType); composeAction?.Invoke(genericBuilder); return(WithGenericBindingBuilder(genericBuilder)); } else { IBindingBuilder builder = (IBindingBuilder)__createTypeBindingBuilderMethod .MakeGenericMethod(serviceType, implementationType) .Invoke(this, Array.Empty <object>()); composeAction?.Invoke(builder); return(WithBindingBuilder(builder)); } }