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