我会试着解释一下我想做什么。我有一个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文件注入解析器?我做错了吗?
答案 0 :(得分:1)
我错了,请参阅下面的更新
此时无法使用注入,因为在初始化映射器配置时会创建解析程序实例。 唯一的可能性是将AppSettings作为要映射的对象之一的一部分。
你唯一可以使用的是静态类,并从其他地方更新其成员,但这是一个非常非常非常糟糕的解决方案。我没有告诉你,这几乎是非法的=)
@Lucian Bargaoanu通过评论
进行更新您可以在文档here
中找到答案