Automapper 使用简单注入器 (Ioc) 将依赖项注入自定义类型转换器

Automapper inject dependencies into custom type converter using Simple injector (Ioc)

我正在使用自动映射器从 dto 映射到域,反之亦然; 我正在使用自定义类型转换器进行转换,但我想使用简单的注入器 ioc 将依赖项注入我的转换器 class;我不能那样做。 请告诉我如何实现?

public class DtoToEntityConverter : ITypeConverter<Dto, Entity>
{
    private readonly IEntityRepository _entityRepository;

    public DtoToEntityConverter (IEntityRepository entityRepository )
    {
        _entityRepository = entityRepository ;
    }

    public Entity Convert(ResolutionContext context)
    {

    }     


}

您需要通过 AutoMapper 配置服务:

var container = ConfigureSimpleInjectorContainer();

Mapper.Initialize(cfg => {
    cfg.ConstructServicesUsing(type => container.GetInstance(type));
    // The rest of your initialization
});

每当我的容器无法访问我的某些代码(如您发布的问题)时,我都会使用这种方法。

public class DtoToEntityConverter : ITypeConverter<Dto, Entity>
{
    private readonly IEntityRepository _entityRepository;

    public DtoToEntityConverter (IEntityRepository entityRepository )
    {
        _entityRepository = entityRepository ;
    }

    public Entity Convert(ResolutionContext context)
    {

    }     
}

如何注册:

Mapper.CreateMap<From, To>().ConvertUsing(new DtoToEntityConverter(Ioc.Resolve<IEntityRepository>()));

Ioc static class 应该包含 IUnitContainer,您可以在其中注册所有依赖项。

public static class IoC
{
    public static IUnityContainer Unity { get; private set; }

    public static T Resolve<T>()
    {
        return Unity.Resolve<T>();
    }

    public static T Resolve<T>(string key)
    {
        return Unity.Resolve<T>(key);
    }

    public static void Initialize(IUnityContainer unity)
    {
        Unity = unity;
    }
}

注意 :确保您已经在映射之前创建了 UnityContainer。您的问题并不典型,您可以考虑重新设计它并保留用于模型到模型映射的映射 (Automapper) only。但可能在某些时候你有奇怪的要求你可以考虑这种方法。

我正在使用 Automapper 6.1.1 和 Microsoft.Extensions.DependencyInjection,这对我有用... 创建类型转换器,例如

    public class ChargesConverter :
            ITypeConverter<ChargesQueryResult, IEnumerable<Charge>>
        {
            private readonly IToggleFeatures features;
            private readonly ITierThresholds tierThresholds;
    
            public ProductWrapperChargesConverter(IToggleFeatures features, ITierThresholds tierThresholds)
            {
                this.features = features;
                this.tierThresholds = tierThresholds;
            }
   // other functionality
}

在映射配置文件中

this.CreateMap<ProductWrapperChargesQueryResultAdapter, IEnumerable<Charge>>().ConvertUsing<ProductWrapperChargesConverter>();