2

我想使用Automapper将UTC的所有日期时间转换为本地时间,但我需要将接口注入ITypeConverter ...我在运行应用程序时收到此错误:MissingMethodException:没有为此对象定义的无参数构造函数。使用ITypeConverter的AutoMapper依赖注入

我认为问题是依赖注入代码!

任何人都可以帮到我吗?

UserRepository:

public class UserRepository : IUserRepository 
{ 
    private static readonly MapperConfiguration Config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<User, User>(); 

     cfg.CreateMap<DateTime?, DateTime?>().ConvertUsing<UtcToLocalConverter>(); 
    }); 

    public List<User> GetById(string[] ids) 
    { 
     var result = BuildQuery().Where(w => ids.Contains(w.UserName)).ToList(); 

     var mapper = Config.CreateMapper(); 

     return mapper.Map<List<User>>(result); // Throws error !!! 
    } 

    #region Helper 

    private IQueryable<User> BuildQuery() 
    { 
     return Settings.EpedDb.User; 
    } 

    #endregion 
} 

转换

public class UtcToLocalConverter : ITypeConverter<DateTime?, DateTime?> 
{ 
    public UtcToLocalConverter(IBaseSettings baseClass) // I tried to inject here!!! 
    { 
     Settings = baseClass; 
    } 

    private IBaseSettings Settings { get; } 

    public DateTime? Convert(DateTime? source, DateTime? destination, ResolutionContext context) 
    { 
     if (source == null) return null; 

     var tzi = TimeZoneInfo.FindSystemTimeZoneById(Settings.UserData.TimeZone); 
     return TimeZoneInfo.ConvertTime(DateTime.SpecifyKind((DateTime)source, DateTimeKind.Utc), tzi); 
    } 
} 
+0

请不要将代码作为截图图像发布。您是否可以将相关代码复制并粘贴到您的问题中? –

+0

@NateBarbettini谢谢你的建议!你怎么看待这件事? – JhobanyPena

回答

1

你的预感是正确的:当您使用CreateUsing<TTypeConverter>()你不能注入任何参数到构造。该类型必须具有无参数的构造函数。

你可以一个实例传递给CreateUsing()

var converter = new UtcToLocalConverter(mySettings); 
cfg.CreateMap<DateTime?, DateTime?>().ConvertUsing(converter); 

但我怀疑,因为你使用依赖注入,试图处理用户的时区在运行时,将无法正常工作。

我认为真实解决您的问题是不处理您的应用程序的这一层时区。 .NET DateTime类在处理时区方面非常糟糕。

你应该:

  • 使用DateTimeOffset?,而不是在UTC DateTime?
  • 始终将日期(偏移0)
  • 不要担心转换时区在应用程序代码
  • 在渲染或表示层,在用户的本地时区中呈现UTC日期

这是处理日期和时区的更简洁的方式。

0

@NateBarbettini说的有道理,但可以使用ConstructServicesUsing完成。文档是here