我正在使用Automapper映射客户对象。每个客户对象都有一个Address对象数组。
在AdressType属性的映射期间,我想使用在Customer对象上的Mapper.Map调用期间传入的变量。该变量与Customer对象本身无关,但与相关地址对象的映射相关。 传入一个使用变量来映射AdressType属性的函数也没问题。有没有办法做这样的事情?
我不确定如何调用ForMember来映射AddressType属性。在映射客户对象之前创建变量。它并不像在ForMember中调用方法来映射AddressType那么容易。我将不得不使用在此过程中创建的变量。
当我输入这个时,我正在考虑将变量设为静态,以便可以通过静态方法返回,该方法可以在ForMember中使用。但第二个想到我不认为我可以逃脱这个,因为应用程序实际上是一个WCF服务。每个请求的变量都不同。
我在VS2012解决方案中使用AutoMapper 4.2.1。 任何想法,指针,生命线?
myVariable = ...
var customerDest = mapper.Map<CustomerSource, CustomerDestination>(someCustomerSource, <my variable or function>);
// Configuration of AutoMapper
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AddressSource, AddressDestination>()
.ForMember(m => m.AddressType,
opt => opt.MapFrom(src => MapAddressType(src.AddressType, <my variable>) ???
public class Customer
{
public Address[] Addresses { get; set; }
}
public Address
{
public string AdresType { get; set; }
}
解决方案:
cfg.CreateMap<AddressSource, AddressDestination>()
.ForMember(m => m.AddressType, opt => opt.ResolveUsing(
(resolutionResult, source) =>
{
var addressType = (resolutionResult.Context.SourceValue as AddressSource).AddressType;
var myVariable = resolutionResult.Context.Options.Items["myVariable"] as Dictionary<string, SomeType>;
return DoStuff(addressType, myVariable);
}));
var dest = mapper.Map<CustomerDestination>(customerSource,
opt => opt.Items["myVariable"] = myVariable);