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>();
我正在使用自动映射器从 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>();