Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否将CreateMap和Map的实例版本与WCF服务一起使用?_C#_Wcf_Mapping_Automapper - Fatal编程技术网

C# 是否将CreateMap和Map的实例版本与WCF服务一起使用?

C# 是否将CreateMap和Map的实例版本与WCF服务一起使用?,c#,wcf,mapping,automapper,C#,Wcf,Mapping,Automapper,和automapper有一些真正的问题。我想我已经找到了解决方案,但不确定如何实施 基本上,我使用ResolveUsing和ConstructedBy的自定义映射将参数传递给构造函数,我知道大多数人只在global.asax中设置过一次,就忘了它 但问题是我的方法(在wcf上)以不同的参数传递给ResolveUsing的构造函数 在我使用Mapper.CreateMap和Mapper.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。就像一个会话覆盖了另一个会话

我希望这是有道理的

  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>();