AutoMapper:为什么UseValue只执行一次 [英] AutoMapper: Why is UseValue only executed once

查看:256
本文介绍了AutoMapper:为什么UseValue只执行一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么 UseValue 只执行一次?
我需要调用每个请求的TeamRepository。



我怎样才能做到这一点?



从映射的 TeamEmployee TeamEmployeeInput:

  CreateMap< TeamEmployee,TeamEmployeeInput> ()
.ForMember(X => x.Teams,X => x.UseValue(GetTeamEmployeeInputs()))
.ForMember(D => d.SelectedTeam,S = GT; S .MapFrom(X => x.Team == NULL?0:x.Team.Id));

私人的IEnumerable< TeamDropDownInput> GetTeamEmployeeInputs()
{
队[] =队与CreateDependency LT; ITeamRepository方式>()GETALL();
返回Mapper.Map<团队[],TeamDropDownInput []>(队);
}



Domain对象:



 公共类TeamEmployee:实体
{
公共虚拟员工员工{搞定;组; }
公共虚拟团队团队{搞定;组; }
}

查看模型对象:



 公共类TeamEmployeeInput 
{
公众诠释?标识{搞定;组; }
公共字符串EmployeeLastName {搞定;组; }
公共字符串EmployeeEMail {搞定;组; }
公共字符串EmployeeFirstName {搞定;组; }

公众诠释SelectedTeam {搞定;组; }

公众的IList< TeamDropDownInput>小组{搞定;组; }
}


公共类TeamDropDownInput:IDropdownList
{
公众诠释标识{搞定;组; }
公共字符串文本{搞定;组; }
}


解决方案

尝试 MapFrom 选项。它提供了一个代表将每次叫的地图的发生。从一个快速的日期时间的测试,这似乎工作我的命令窗口



是这样的:

 公共类Foo {
公众的DateTime酒吧{搞定;组; }
}

公共类Foo1
{
公众的DateTime BAR1 {搞定;组; }
}
Mapper.CreateMap<富,Foo1>()
.ForMember(X => x.bar1,选择=> opt.MapFrom(X => DateTime.Now )); //不使用X,你的函数返回BAR1



我要指出,这是不是这样AutoMapper被设计为工作。 AutoMapper应该映射从一个模式到另一个属性。因此,如果数据没有对 MODELA 你不应该的地图的数据为 modelB 存在



您的代码改变是:

  CreateMap< TeamEmployee, TeamEmployeeInput>()
.ForMember(X => x.Teams,X => x.MapFrom(X => GetTeamEmployeeInputs()))


Why is UseValue only executed once? I need to call the TeamRepository for each request.

How can I achieve this?

Mapping from TeamEmployee to TeamEmployeeInput:

CreateMap<TeamEmployee, TeamEmployeeInput>()
    .ForMember(x => x.Teams, x => x.UseValue(GetTeamEmployeeInputs()))
    .ForMember(d => d.SelectedTeam, s => s.MapFrom(x => x.Team == null ? 0 : x.Team.Id));

private IEnumerable<TeamDropDownInput> GetTeamEmployeeInputs()
{
    Team[] teams = CreateDependency<ITeamRepository>().GetAll();
    return Mapper.Map<Team[], TeamDropDownInput[]>(teams);
}

Domain object:

public class TeamEmployee : Entity
{
    public virtual Employee Employee { get; set; }
    public virtual Team Team { get; set; }
}

View model objects:

public class TeamEmployeeInput
{
    public int? Id { get; set; }
    public string EmployeeLastName { get; set; }
    public string EmployeeEMail { get; set; }
    public string EmployeeFirstName { get; set; }

    public int SelectedTeam { get; set; }

    public IList<TeamDropDownInput> Teams { get; set; }
}


public class TeamDropDownInput : IDropdownList
{
    public int Id { get; set; }
    public string Text { get; set; }
}

解决方案

Try the MapFrom option. It provides a delegate that will be called each time a map happens. From a quick DateTime test and my command window this seems to work.

Something like:

public class Foo {
    public DateTime bar { get; set; }
}

public class Foo1
{
    public DateTime bar1 { get; set; }
}
Mapper.CreateMap<Foo, Foo1>()
    .ForMember(x => x.bar1, opt => opt.MapFrom(x => DateTime.Now)); // not using x, your function returns the value for bar1

I have to point out that this is not the way AutoMapper is designed to work. AutoMapper should map properties from one model to another. So if the data does not exist on modelA you should not map that data to modelB.

Your code change would be:

CreateMap<TeamEmployee, TeamEmployeeInput>()
    .ForMember(x => x.Teams, x => x.MapFrom(x => GetTeamEmployeeInputs()))

这篇关于AutoMapper:为什么UseValue只执行一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆