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);
        }
예제 #2
0
        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));
            }
        }