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

mar*_*ith 12 c# mapping wcf automapper

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

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

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

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

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

但我似乎无法找到如何做到这一点.有人可以解释一下吗?我真的被困了......

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

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

编辑 - 我有什么例子

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

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

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

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

我希望这是有道理的.

  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))
            ;
Run Code Online (Sandbox Code Playgroud)

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

请参阅我的评论内联代码.在构造函数中,urlTemplate到达,我将其保存在私有var中,然后在重写的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
Run Code Online (Sandbox Code Playgroud)

临时解决方案

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

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

当然,这真的是补丁而不是理想,但它让我跑步.

我哪里错了?

roo*_*oot 34

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

代替...

Mapper.CreateMap<Dto.Ticket, Entities.Ticket>()
Run Code Online (Sandbox Code Playgroud)

您可以使用:

var configurationStore =
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
var mapper = new MappingEngine(configurationStore);
configurationStore.CreateMap<Dto.Ticket, Entities.Ticket>()
Run Code Online (Sandbox Code Playgroud)

  • 我不知道旧版本的AutoMapper,但在当前版本中,`Configuration`类被命名为`ConfigurationStore`. (20认同)
  • 而`AllMappers()`方法现在是一个名为`Mappers`的属性. (2认同)

Jay*_*ker 13

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

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>();
Run Code Online (Sandbox Code Playgroud)


mar*_*ith 2

好吧,看来我的问题被放弃了,但经过一段时间的研究,我终于找到了一个很好的解决方案。

基本上我在一个 Resolve 中,并且我有另一个 MAP,其中一个属性称为另一个 ResolveUsing ...

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

所以我用 foreach 替换了第二个映射,并像我原来的 Resolve 中那样进行了映射...

我已将答案放在这里,以防将来对其他人有所帮助。

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

我一直想知道是否可以使用映射器的实例版本来做到这一点,我虽然它存在......但从未发现......

但无论如何,现在一切都 100% 正常工作......