/// <summary> /// Create <see cref="Expression"/> for service which is associated with contract. /// </summary> /// <param name="interfaceType">Type of contract</param> /// <param name="register">The ServiceRegister</param> /// <param name="state">The ServiceState</param> /// <param name="serviceName"></param> /// <param name="attributes"></param> /// <returns>Returns <see cref="Expression"/> of service constructor.</returns> public override Expression Create(Type interfaceType, ServiceRegister register, ServiceState state, string serviceName, TypeContextAttributes attributes) { if (interfaceType == null) { throw new ArgumentNullException(nameof(interfaceType)); } //Register current subcontract service with ServiceRegistrar //Root service will refresh with the updated service when there's replacement with new service register.Register(interfaceType); BaseServiceInfo serviceMeta = GetServiceInfo(interfaceType, serviceName); if (serviceMeta == null) { return(SharedFactory.Create(interfaceType, register, state, serviceName, attributes)); } var userdefinedExpression = serviceMeta.GetServiceInstanceExpression(); if (userdefinedExpression != null) { return(Expression.Invoke(userdefinedExpression)); } return(CreateConstructorExpression(interfaceType, serviceMeta.ServiceType, register, state) ?? Expression.Default(interfaceType)); }
/// <summary> /// Create <see cref="Expression"/> for service which is associated with contract. /// </summary> /// <param name="interfaceType">Type of contract</param> /// <param name="register">The ServiceRegister</param> /// <param name="state">The ServiceState</param> /// <param name="serviceName"></param> /// <param name="attributes"></param> /// <returns>Returns <see cref="Expression"/> of service constructor.</returns> public override Expression Create(Type interfaceType, ServiceRegister register, ServiceState state, string serviceName, TypeContextAttributes attributes) { if (interfaceType == null) { throw new ArgumentNullException(nameof(interfaceType)); } //Register current subcontract service with ServiceRegistrar //Root service will refresh with the updated service when there's replacement with new service register.Register(interfaceType); BaseServiceInfo serviceMeta = GetServiceInfo(interfaceType, serviceName); //Throw exception if service meta not found in the service map table if (serviceMeta == null) { if (attributes.HasAttribute(typeof(OptionalAttribute))) { return(Expression.Default(interfaceType)); } else { ExceptionHelper.ThrowContractNotRegisteredException($"Type '{interfaceType.FullName}' was not registered with dependency container or shared container."); } } var userdefinedExpression = serviceMeta.GetServiceInstanceExpression(); if (userdefinedExpression != null) { return(Expression.Invoke(userdefinedExpression)); } return(CreateConstructorExpression(interfaceType, serviceMeta.ServiceType, register, state) ?? Expression.Default(interfaceType)); }