使用CreateMap的实例版本和使用WCF服务映射?

与automapper有一些实际问题。 我想我找到了解决方案但不确定如何实现它。

基本上我使用ResolveUsing和ConstructedBy的自定义映射将params传递给构造函数,我知道大多数人在global.asax中设置了一次而忘记了它。

但问题是我的方法(在wcf上)将不同的参数传递给ResolveUsing的构造函数……

在我使用静态方法的Mapper.CreateMap和Mapper.Map之前,看来当不同的请求通过方法(多用户)进入wcf服务时,它们彼此冲突。

看完之后,我可以使用CreateMap和Map的实例版本,这样每个请愿书都可以获得自己的地图并传入自己的参数。

但我似乎无法找到如何做到这一点。 谁能解释一下吗? 我真的被困了……

在一次又一次之前,我会得到重复的键错误,并且我在构造函数上添加了一个日志跟踪,看起来1请求覆盖了另一个 – 因此是静态版本的Mapper。

好吧,我希望我是对的,但我找不到别的……

编辑 – 我有什么例子

基本上所有映射都正常工作,因为我在大多数情况下使用MapFrom。

然后我创建一个我的Resolver实例,我在URL中传递。 在我传递之前我检查了url并且它是正确的。 但是一旦它返回它就会返回错误的URL。

我需要在URL中传递的原因是它有变量,所以我需要替换变量…基本上有两个url取决于办公室,我到处都有日志,我可以看到我传递的内容但是一次我把它传递进去 – 它不是我传入的那个,如果这是有道理的,这很奇怪!

它是一个WCF服务和一个客户端调用该方法两次通过2个不同的办公室,因此2个不同的URL。 但是它们总是返回相同的URL。 就好像一个会话正在覆盖另一个会话……

我希望这是有道理的。

SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode); Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.TaxIncluded, opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded)) .ForMember(dest => dest.TaxPercentage, opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxPercentage)) .ForMember(dest => dest.SalesPoints, opt => opt.ResolveUsing(newSalesPointResolver)) ; 

找出失败的地方 – 但不知道为什么

请参阅我的评论内联代码。 在构造函数中,urlTemplate到达,我将其保存在私有var中,然后在重写的ResolveCore中,它是另外的东西:-)

我已经在那里放了一些log4net日志,所以我可以看到发生了什么。

 [Log] public class SalesPointResolver : ValueResolver<Models.Custom.House, IList> { private readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private string urlTemplate; public SalesPointResolver (bool returnReservationUrl, string urlTemplate, DateTime startDate, DateTime endDate, string officeCode) { this.urlTemplate = urlTemplate; log.Error("passed in " + urlTemplate); // THIS IS PERFECT log.Error("I am now " + this.urlTemplate); // THIS IS PERFECT } protected override IList ResolveCore(House source) { this.house = source; log.Error("in resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE 

临时解决方案

我已经做了一个临时解决方案,但这真的很糟糕。 我确信automapper可以做我正在尝试的事情,但我显然做错了什么。

基本上我通过LINQ返回一组记录(这是我的来源)所以我在每个记录上输入了一个新字段,其中包含正确的URL模板。 然后,不是传入(通过构造函数)url模板,而是将它作为集合(THE SOURCE)上的每条记录的属性提供……并且它完美无缺。

当然,这确实是补丁而不是理想,但它让我跑步。

我哪里错了?

是的,有一种方法可以使用AutoMapper的实例版本。

代替…

 Mapper.CreateMap() 

您可以使用:

 var configurationStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers); var mapper = new MappingEngine(configurationStore); configurationStore.CreateMap() 

回应卢克伍德沃兹对新语法的评论 :

 ConfigurationStore store = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers); store.AssertConfigurationIsValid(); MappingEngine engine = new MappingEngine(store); //add mappings via Profiles or CreateMap store.AddProfile(); store.CreateMap(); 

好吧,似乎我的问题被抛弃但经过一段时间的游戏,我终于找到了一个好的解决方案..

基本上我在Resolve里面,我有另一个MAP,其中一个属性称为另一个ResolveUsing ……

似乎这似乎存在问题。 另一个奇怪的事情是,每次应用程序池启动或回收时它都会失败。因此它第一次失败然后就好了,直到循环发生(我正在使用wcf应用程序)。

所以我用foreach替换了第二个Mapping,并在我原来的Resolve中完成了我的映射……

我已经把答案放在这里,以防将来可以帮助其他人。

我使用Mapper静态方法来做我的映射,这些不在global.asax中,因为我需要根据某些因素传递不同的东西。

我总是想知道是否可以使用mappper的Instance版本来实现它,虽然它存在…..但从未发现..

但无论如何,现在所有人都在100%工作……

您是否查看过使用目标对象的Map调用?

var bar = new Bar(“Custom each call”);

Mapper.Map(foo,bar);

如果你想在Automapper中使用Mapper的实例版本,那么我认为你可以使用MappingEngine类。 我相信静态Mapper类实例化并配置一个MappingEngine对象来完成所有细节映射工作。

以下是将IoC应用于Automapper的示例(需要实例化MappingEngine)

http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx