我正在尝试使用 Automapper 将我的所有 DateTimes 从 UTC 转换为本地时间,但我需要将接口(interface)注入(inject) ITypeConverter...当我运行应用程序时收到此错误: MissingMethodException:没有为此对象定义无参数构造函数。
我认为问题在于依赖注入(inject)代码!
任何人都可以帮助我吗?
用户存储库:
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);
}
}
最佳答案
你的预感是正确的:当你使用 CreateUsing<TTypeConverter>()
时,你不能在构造函数中注入(inject)任何参数。 .该类型必须具有无参数构造函数。
您可以将单个实例传递给 CreateUsing()
:
var converter = new UtcToLocalConverter(mySettings);
cfg.CreateMap<DateTime?, DateTime?>().ConvertUsing(converter);
但我怀疑这不起作用,因为您正在使用依赖注入(inject)来尝试在运行时处理用户的时区。
我认为 真实 您的问题的解决方案是不在应用程序的这一层处理时区。 .NET
DateTime
类(class)在处理时区方面是出了名的糟糕。你应该:
DateTimeOffset?
而不是 DateTime?
这是处理日期和时区的一种更简洁的方法。
关于dependency-injection - 使用 ITypeConverter 进行 AutoMapper 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45339641/