internal static void ConfigAction(
     this Container c,
     IMapperConfigurationExpression cfg,
     AutoMapperSimpleInjectorConfiguration serviceCfg)
 {
     serviceCfg.MapperConfigurationExpressionAction.Invoke(
         c,
         cfg);
     cfg.ConstructServicesUsing(c.GetInstance);
     cfg.AddMaps(serviceCfg.AssembliesToScan);
 }
    /// <summary>
    /// Add AutoMapper to SimpleInjector with configuration action.
    /// </summary>
    /// <param name="container"><see cref="Container"/>.</param>
    /// <param name="configuration"><see cref="AutoMapperSimpleInjectorConfiguration"/> instance.</param>
    /// <returns><see cref="Container"/>.</returns>
    public static Container AddAutoMapper(
        this Container container,
        Action <AutoMapperSimpleInjectorConfiguration>?configuration)
    {
        if (container is null)
        {
            throw new ArgumentNullException(nameof(container));
        }

        var serviceConfig = new AutoMapperSimpleInjectorConfiguration();

        configuration?.Invoke(serviceConfig);

        var uniqueAssemblies = serviceConfig.AssembliesToScan.Distinct().ToArray();

        container.RegisterIncludingGenericTypeDefinitions(uniqueAssemblies, typeof(IValueResolver <, ,>));
        container.RegisterIncludingGenericTypeDefinitions(uniqueAssemblies, typeof(IMemberValueResolver <, , ,>));
        container.RegisterIncludingGenericTypeDefinitions(uniqueAssemblies, typeof(ITypeConverter <,>));
        container.RegisterIncludingGenericTypeDefinitions(uniqueAssemblies, typeof(IValueConverter <,>));
        container.RegisterIncludingGenericTypeDefinitions(uniqueAssemblies, typeof(IMappingAction <,>));

        container.Register <IConfigurationProvider>(
            () =>
            new MapperConfiguration(
                cfg => container.ConfigAction(cfg, serviceConfig)),
            Lifestyle.Singleton);

        var customMapperInstance = serviceConfig.MapperInstanceCreator();

        if (customMapperInstance != null)
        {
            container.Register(
                () => customMapperInstance,
                serviceConfig.Lifestyle);
        }
        else if (serviceConfig.MapperImplementationType == typeof(Mapper))
        {
            container.Register(
                () => container.GetInstance <IConfigurationProvider>().CreateMapper(),
                serviceConfig.Lifestyle);
        }
        else
        {
            container.Register(typeof(IMapper), serviceConfig.MapperImplementationType, serviceConfig.Lifestyle);
        }

        return(container);
    }