private static ContainerBuilder BindFunc <TService>(ContainerBuilder builder, Func <TService> func, Action <IBindingBuilder> composeAction) { TypeInfo serviceType = typeof(TService).GetTypeInfo(); TypeInfo implementationType = func.GetMethodInfo().GetGenericArguments()[0].GetTypeInfo(); if (serviceType.IsGenericTypeDefinition) { if (serviceType.GetGenericArguments().Length != implementationType.GetGenericArguments().Length) { throw new BindingInvalidException("Generic service types must have a generic func with matching argument count."); } IGenericBindingBuilder <TService> genericBindingBuilder = new GenericFuncBindingBuilder <TService>(builder, func); composeAction?.Invoke(genericBindingBuilder); builder.WithGenericBindingBuilder(genericBindingBuilder); } else { IBindingBuilder bindingBuilder = new FuncBindingBuilder <TService>(builder, func); composeAction?.Invoke(bindingBuilder); builder.WithBindingBuilder(bindingBuilder); } return(builder); }
public IContainer Bind(Type serviceType, Func <object> createFunc, Action <IBindingBuilder> composeAction = null) { TypeInfo serviceTypeInfo = serviceType.GetTypeInfo(); if (serviceTypeInfo.IsGenericTypeDefinition) { IGenericBindingBuilder genericBuilder = new GenericFuncBindingBuilder(this, serviceType, createFunc); composeAction?.Invoke(genericBuilder); return(WithGenericBindingBuilder(genericBuilder)); } else { IBindingBuilder builder = (IBindingBuilder)__createFuncBindingBuilderMethod .MakeGenericMethod(serviceType) .Invoke(this, new object[] { createFunc }); composeAction?.Invoke(builder); return(WithBindingBuilder(builder)); } }