Kev*_*ski 33 .net c# wcf automapper
我在WCF服务中使用AutoMapper来返回User对象. User具有诸如AccountTeams本身具有子对象的属性.所有类都有AutoMapper贴图.
根据OperationContract所调用的WCF ,我想返回不同数量的数据.我希望一个OperationContract人返回该User对象而不AccountTeams填充其属性(及其子代),另一个OperationContract返回User整个属性链填充的对象.
有没有办法在同一个两个对象之间有两个不同的映射,或者我是否需要执行完整的映射以及null我不想从服务返回的属性?
wal*_*wal 15
我假设你是映射User到User(如果不是那么只是改变目标类型)
为以下示例假设此类:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用单独AutoMapper.Configuration来定义2个地图:
[TestMethod]
public void TestMethod()
{
var configuration1 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
var mapper1 = new MappingEngine(configuration1);
configuration1.CreateMap<User, User>();
var user = new User() { Name = "John", Age = 42 };
var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age
var configuration2 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
configuration2.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
var mapper2 = new MappingEngine(configuration2);
var mappedUser2 = mapper2.Map<User, User>(user);
Assert.AreEqual(0, mappedUser2.Age);//maps only Name
}
Run Code Online (Sandbox Code Playgroud)
为了避免映射所有其他类型的两倍,你可以添加需要的常用方法Configuration,其映射,可以从到达的一切User,并呼吁这两个configuration1和configuration2呼叫后CreateMap.
对于Automapper 4.x,请使用以下命令:
var configuration1 = new MapperConfiguration(cfg =>
{
cfg.CreateMap<User, User>();
});
var mapper1 = configuration1.CreateMapper();
var user = new User() { Name = "John", Age = 42 };
var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age
var configuration2 = new MapperConfiguration(cfg =>
{
cfg.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
});
var mapper2 = configuration2.CreateMapper();
var mappedUser2 = mapper2.Map<User, User>(user); //maps only Name
Run Code Online (Sandbox Code Playgroud)
Sim*_*wsi 13
Kevin Kalitowski对wal的回答提出了一个很好的观点:如果我们需要两个配置来处理需要不同的映射,那么我们不必复制所有其他常见的映射吗?
我想我已经找到了解决这个问题的方法:使用每个唯一映射的一个配置文件,以及公共映射的第三个配置文件.然后创建两个配置,每个配置对应一个唯一的配置文件,同时也为每个配置添加公共配置文件.
例如,在AutoMapper 4.2中:
要映射的类:用户和车辆:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Vehicle
{
public int FleetNumber { get; set; }
public string Registration { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
简介:
public class Profile1 : Profile
{
protected override void Configure()
{
base.CreateMap<User, User>();
}
}
public class Profile2 : Profile
{
protected override void Configure()
{
base.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
}
}
public class CommonProfile : Profile
{
protected override void Configure()
{
base.CreateMap<Vehicle, Vehicle>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建配置并映射对象:
[TestMethod]
public void TestMethod()
{
var user = new User() { Name = "John", Age = 42 };
var vehicle = new Vehicle {FleetNumber = 36, Registration = "XYZ123"};
var configuration1 = new MapperConfiguration(cfg =>
{
cfg.AddProfile<CommonProfile>();
cfg.AddProfile<Profile1>();
});
var mapper1 = configuration1.CreateMapper();
var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age
var mappedVehicle1 = mapper1.Map<Vehicle, Vehicle>(vehicle);//Maps both FleetNumber
//and Registration.
var configuration2 = new MapperConfiguration(cfg =>
{
cfg.AddProfile<CommonProfile>();
cfg.AddProfile<Profile2>();
});
var mapper2 = configuration2.CreateMapper();
var mappedUser2 = mapper2.Map<User, User>(user);//maps only Name
var mappedVehicle2 = mapper2.Map<Vehicle, Vehicle>(vehicle);//Same as mappedVehicle1.
}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,它的工作原理.
| 归档时间: |
|
| 查看次数: |
26952 次 |
| 最近记录: |