不知如何IValueResolver
在新版AutoMapper中使用新界面。也许我在以前版本的 AutoMapper 中使用不当......
我有很多模型类,其中一些是使用 sqlmetal 从多个数据库服务器上的多个数据库生成的。
其中一些类有一个字符串属性 ,PublicationCode
它标识订阅、报价、发票或任何它属于哪个出版物。
发布可以存在于两个系统(旧系统和新系统)中的任何一个中,因此我在目标模型类上有一个 bool 属性,它告诉发布是在旧系统中还是新系统中。
使用 AutoMapper 的旧版本(<5?),我使用 aValueResolver<string, bool>
作为PublicationCode
输入参数,并返回一个bool
指示发布位置(旧系统或新系统)的指示。
使用 AutoMapper 的新版本(5+?),这似乎不再可能。新的 IValueResolver 需要对我拥有的源模型和目标模型的每一个组合进行唯一的实现,其中src.PublicationCode
需要解析为dst.IsInNewSystem
.
我只是试图以错误的方式使用价值解析器吗?有没有更好的办法?我想使用解析器的主要原因是我希望将服务注入构造函数,而不必DependencyResolver
在代码中使用等(我正在使用 Autofac)。
目前,我通过以下方式使用它:
// Class from Linq-to-SQL, non-related properties removed.
public class FindCustomerServiceSellOffers {
public string PublicationCode { get; set; }
}
这是我拥有的几个数据模型类之一,其中包含一个 PublicationCode 属性)。这个特定的类被映射到这个视图模型:
public class SalesPitchViewModel {
public bool IsInNewSystem { get; set; }
}
这两个类的映射定义是(其中表达式是 IProfileExpression),删除了不相关的映射:
expression.CreateMap<FindCustomerServiceSellOffers, SalesPitchViewModel>()
.ForMember(d => d.IsInNewSystem, o => o.ResolveUsing<PublicationSystemResolver>().FromMember(s => s.PublicationCode));
和解析器:
public class PublicationSystemResolver : ValueResolver<string, bool>
{
private readonly PublicationService _publicationService;
public PublicationSystemResolver(PublicationService publicationService)
{
_publicationService = publicationService;
}
protected override bool ResolveCore(string publicationCode)
{
return _publicationService.IsInNewSystem(publicationCode);
}
}
以及映射器的使用:
var result = context.FindCustomerServiceSellOffers.Where(o => someCriteria).Select(_mapper.Map<SalesPitchViewModel>).ToList();