dependency-injection - 使用 ITypeConverter 进行 AutoMapper 依赖注入(inject)

标签 dependency-injection asp.net-core .net-core automapper typeconverter

我正在尝试使用 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?
  • 始终以 UTC 格式存储日期(偏移量 0)
  • 不用担心在应用程序代码中转换时区
  • 在渲染或表示层,渲染用户本地时区的UTC日期

  • 这是处理日期和时区的一种更简洁的方法。

    关于dependency-injection - 使用 ITypeConverter 进行 AutoMapper 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45339641/

    相关文章:

    c# - .NET 核心中的 IQueryable OrderBy 表达式

    java - 使用 .NET 创建复制 Java 代码的 Base 64 字节数组

    linux - 在 Linux 托管代理上找不到 Dockerfile

    c# - 如何将依赖项注入(inject) Caliburn.Micro 中的 View 模型?

    python - 如何将 nameko 依赖项传递给 SqlAlchemy 事件处理程序?

    c# - 具有依赖注入(inject)的基本 Controller 的设计模式 - MVC 3 + Ninject

    c# - Blazor 将多个选择绑定(bind)到一个值

    javascript - AngularJS - 将 $factory 注入(inject) Controller

    c# - 解决 XUnit2 项目的依赖关系,类似于处理 MVC6 Core 1.0 项目的方式

    javascript - 数据来自API,但不显示。 Angular 9 ABP 框架