【问题标题】:How can I use an app setting in a custom resolver?如何在自定义解析器中使用应用设置?
【发布时间】:2018-06-21 09:32:10
【问题描述】:

我会尝试解释我想要做什么。我有一个Server 对象,其中包含一个参数,其日期为上次“同步”的日期

public class Server
{
    public Guid Id { get; set; }
    public DateTime LastSyncedAt { get; set; }
}

我想把它映射到一个ServerSummary 对象,它有一个Status 参数。

public class ServerSummary
{
    public Guid Id { get; set; }
    public string Status { get; set; }
}

此状态将通过检查服务器是否已在最后 X 分钟内同步来设置,其中 X 存储在我的 appsettings.json 文件中:

{
  "SyncOffsetMinutes": "5"
}

我有一个模型类:

public class AppSettings
{
    public int SyncOffsetMinutes { get; set; }
}

在我的 Startup.cs 类中配置:

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.Configure<AppSettings>(Configuration);
}

要解决这个 Status 属性,我在我的 AutoMapper 配置文件配置中有这个:

public class MyAutoMapperProfileConfiguration : Profile
{
    public MyAutoMapperProfileConfiguration()
    {
        CreateMap<Server, ServerSummary>()
            .ForMember(d => d.Status, o => o.ResolveUsing<ServerSyncStatusResolver>());
    }
}

在我的自定义解析器中,我尝试使用 DI 注入我的 AppSettings,以便我可以在我的 Resolve 方法中使用应用设置:

public class ServerSyncStatusResolver : IValueResolver<Server, ServerSummary, string>
{
    private AppSettings _appSettings;

    public ServerSyncStatusResolver(AppSettings appSettings)
    {
        _appSettings = appSettings;
    }

    public string Resolve(Server source, ServerSummary destination, string member, ResolutionContext context)
    {
        return source.LastSyncedAt.AddMinutes(_appSettings.SyncOffsetMinutes) < DateTime.UtcNow ? "Offline" : "Online";
    }
}

但是当我实际进行映射时:

var servers = _dbContext.Servers.ToList();
var serverSummaries = Mapper.Map<List<Server>, List<ServerSummary>>(servers);

我收到一个错误提示

没有为此对象定义无参数构造函数

有没有办法将我的 AppSettings 文件注入到解析器中?我做错了吗?

【问题讨论】:

  • 你是否为 AppSettings 添加了依赖注入?
  • 请不要在问题标题中添加标签。见Tagging in Helpcenter
  • @Seminda 我不确定你的意思?
  • 感谢@LucianBargaoanu 的链接,但我不确定我需要在解决方案中进行哪些更改才能使其正常工作。我需要在我的 Startup 类中添加一些东西吗?

标签: c# asp.net dependency-injection asp.net-core automapper


【解决方案1】:

我错了,请看下面的更新

此时您不能使用注入,因为解析器实例是在初始化映射器配置时创建的。 唯一的可能是将 AppSettings 作为要映射的对象之一的一部分。

您唯一可以使用的是静态类并从其他地方更新其成员,但这是一个非常、非常、非常糟糕的解决方案。我没告诉你,这几乎是违法的=)

@Lucian Bargaoanu 从 cmets 更新

您可以在文档here中找到答案

猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2014-12-01
  • 2022-10-13
  • 2021-06-27
相关资源
最近更新 更多