繁体   English   中英

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

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

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

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静态类应该保存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 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>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM