C# 是否将CreateMap和Map的实例版本与WCF服务一起使用?
和automapper有一些真正的问题。我想我已经找到了解决方案,但不确定如何实施 基本上,我使用ResolveUsing和ConstructedBy的自定义映射将参数传递给构造函数,我知道大多数人只在global.asax中设置过一次,就忘了它 但问题是我的方法(在wcf上)以不同的参数传递给ResolveUsing的构造函数 在我使用Mapper.CreateMap和Mapper.Map之前,它们是静态方法,当不同的请求通过方法(多用户)进入wcf服务时,它们似乎相互冲突 在阅读了一些内容之后,我可以使用CreateMap和Map的实例版本,这样每个请求都可以获得自己的Map,并可以传递自己的参数 但我似乎找不到该怎么做。谁能解释一下吗?我真的被卡住了 在此之前,我经常会出现重复的键错误,并且我在构造函数上添加了日志跟踪,似乎1个请求正在覆盖另一个请求-因此是Mapper的静态版本 嗯,我希望我是对的,但我找不到其他任何东西 已编辑-我拥有的示例 基本上,所有的映射都在正常工作,因为我在大多数情况下都使用MapFrom 然后,我创建一个解析程序实例,并将其传入URL。在传入url之前,我已经检查了它,并且它是正确的。但一旦返回,它就会返回错误的URL 我需要传入URL的原因是,URL中有变量,所以我需要替换这些变量。。。基本上有2个URL,取决于办公室,我到处都有日志,我可以看到我传入的内容,但一旦传入,它就不是我传入的,如果这有意义的话,这很奇怪 它是一个WCF服务,一个客户端调用了该方法两次,并在两个不同的办公室中传递了两个不同的URL。但它们总是返回相同的URL。就像一个会话覆盖了另一个会话 我希望这是有道理的C# 是否将CreateMap和Map的实例版本与WCF服务一起使用?,c#,wcf,mapping,automapper,C#,Wcf,Mapping,Automapper,和automapper有一些真正的问题。我想我已经找到了解决方案,但不确定如何实施 基本上,我使用ResolveUsing和ConstructedBy的自定义映射将参数传递给构造函数,我知道大多数人只在global.asax中设置过一次,就忘了它 但问题是我的方法(在wcf上)以不同的参数传递给ResolveUsing的构造函数 在我使用Mapper.CreateMap和Mapper.Map之前,它们是静态方法,当不同的请求通过方法(多用户)进入wcf服务时,它们似乎相互冲突 在阅读了一些内容之
SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode);
Mapper.CreateMap<Models.Custom.House, DTO.House>()
.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))
;
SalesPointResolver newSalesPointResolver=newSalesPointResolver(returnReservationUrl、reservationSite.ReservationUrl、startDate、endDate、officeCode);
Mapper.CreateMap()
.ForMember(dest=>dest.Id,opt=>opt.MapFrom(src=>src.Id))
.FormMember(目标=>dest.tax包括在内,
opt=>opt.MapFrom(src=>src.Segments.FirstOrDefault().TaxIncluded))
.FormMember(目标=>目标税率百分比,
opt=>opt.MapFrom(src=>src.Segments.FirstOrDefault().TaxPercentage))
.FormMember(目标=>目标销售点,
选择=>
opt.resolvessing(newSalesPointResolver))
;
找出失败的地方-但不知道原因
请参阅我的注释与代码内联。在urlTemplate到达的构造函数中,我将其保存在一个私有变量中,然后在重写的ResolveCore中,它是另一个东西:-)
我已经在那里放置了一些log4net日志,所以我可以看到发生了什么
[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
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<DTO.SalesPoint> ResolveCore(House source)
{
this.house = source;
log.Error("in resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE
[日志]
公共类SalesPointResolver:ValueResolver
{
private readonly ILog log=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
私有字符串模板;
公共SalesPointResolver(布尔返回保留URL、字符串URL模板、日期时间开始日期、日期时间结束日期、字符串officeCode)
{
this.urlTemplate=urlTemplate;
log.Error(“传入”+urlTemplate);//这太完美了
log.Error(“我现在”+this.urlTemplate);//这太完美了
}
受保护的覆盖IList ResolveCore(内部源)
{
this.house=来源;
log.Error(“在resolveCore中:+this.urlTemplate);//这返回了错误的值
临时解决方案
我已经做了一个临时解决方案,但它真的很糟糕。我相信automapper可以做我正在尝试的事情,但我显然做错了什么
基本上,我通过LINQ返回一个记录集合(这是我的源代码),因此我在每个记录上输入了一个新字段,其中包含正确的URL模板。然后,我没有(通过构造函数)传入URL模板,而是将其作为集合(源代码)上每个记录的属性使用……它工作得非常完美
当然,这真的是一个补丁,并不理想,但它让我运行
我哪里出错了?您是否考虑过使用接收目标对象的映射调用 var bar=新条(“自定义每次调用”)
Mapper.Map(foo,bar);看来我的问题被放弃了,但经过一段时间的反复思考,我终于找到了一个很好的解决办法 基本上,我在一个Resolve中,我有另一个映射,其中一个属性称为另一个ResolveUsing 这似乎是有问题的。另一件奇怪的事情是,每次启动或回收应用程序池时,它都失败了。因此,它第一次失败,然后在回收发生之前一直正常(我使用的是wcf应用程序) 所以我用foreach替换了第二个映射,并在原始解析中这样做了映射 我把答案放在这里,以防将来对其他人有帮助 我使用Mapper静态方法进行映射,这些方法不在global.asax中,因为我需要根据某些因素传递不同的内容 我一直想知道是否有可能用Mapper的实例版本来实现它,我认为它是存在的……但从未发现
但是无论如何,现在所有的都100%工作了…如果你想在Automapper中使用映射器的实例化版本,那么我认为你可以使用MappingEngine类。我相信静态映射器类实例化并配置一个MappingEngine对象来完成所有的工作
Mapper.CreateMap<Dto.Ticket, Entities.Ticket>()
var configurationStore =
new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
var mapper = new MappingEngine(configurationStore);
configurationStore.CreateMap<Dto.Ticket, Entities.Ticket>()
ConfigurationStore store
= new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
store.AssertConfigurationIsValid();
MappingEngine engine = new MappingEngine(store);
//add mappings via Profiles or CreateMap
store.AddProfile<MyAutoMapperProfile>();
store.CreateMap<Dto.Ticket, Entities.Ticket>();