如何在自定义解析程序中使用应用程序设置?

时间:2018-01-11 23:34:29

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

我会试着解释一下我想做什么。我有一个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文件注入解析器?我做错了吗?

1 个答案:

答案 0 :(得分:1)

我错了,请参阅下面的更新

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

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

@Lucian Bargaoanu通过评论

进行更新

您可以在文档here

中找到答案