42

我在我的 ASP.NET MVC 网站中使用 AutoMapper 将我的数据库对象映射到 ViewModel 对象,并且我正在尝试使用多个配置文件来映射相同的类型,但使用另一种逻辑。通过阅读马特的博客文章,我有了这样做的想法,他说:

真正关键的部分是 AutoMapper 配置文件。您可以使用配置文件对配置进行分组。也许在一个配置文件中您以一种方式格式化日期,在另一个配置文件中您以另一种方式格式化日期。我在这里只使用一个配置文件。

所以我为一个案例创建了一个配置文件:

public class MyProfile : Profile
{
    protected override string ProfileName
    {
        get
        {
            return "MyProfile";
        }
    }

    protected override void Configure()
    {
        CreateMap<DateTime, String>().ConvertUsing<StringFromDateTimeTypeConverter>();
    }
}

public class StringFromDateTimeTypeConverter : ITypeConverter<DateTime, String>
{
    public string Convert(DateTime source)
    {
        return source.ToString("dd/mm/yyyy", CultureInfo.InvariantCulture);
    }
}

另一个用于另一种情况:

public class MyProfile2 : Profile
{
    protected override string ProfileName
    {
        get
        {
            return "MyProfile2";
        }
    }

    protected override void Configure()
    {
        CreateMap<DateTime, String>().ConvertUsing<AnotherStringFromDateTimeTypeConverter>();
    }
}

public class AnotherStringFromDateTimeTypeConverter : ITypeConverter<DateTime, String>
{
    public string Convert(DateTime source)
    {
        return source.ToString("mm - yyyy", CultureInfo.InvariantCulture);
    }
}

但是,我找不到Mapper.Map<>()指定配置文件的方法的任何重载。我也没有运气看了一下这个Configuration物体。
最后注册的配置文件始终优先。

有没有办法为此目的使用配置文件?

4

2 回答 2

48

配置文件用于分离跨多个类型映射应用的通用配置,例如格式化。但是,类型映射仍然是全局的。您最好创建单独的配置对象,并为每个对象创建一个单独的 MappingEngine。Mapper 类只是其中每一个的静态外观,具有一些生命周期管理。

于 2010-02-04T01:52:10.117 回答
0

从 AutoMapper v10 开始。你需要实例化一个IMapper使用Profile你想要的特定的。像这样的东西:

MapperConfiguration config = new MapperConfiguration(cfg => {
    cfg.AddProfile(new MyProfile());
});
IMapper mapper = new Mapper(config);
var myHuman = mapper.map<Human>(myPerson);

可以用小写或大写的 a 将 a 映射Person到 a 的示例。HumanName

class Program
{
    static void Main(string[] args)
    {
        Person myPerson = new Person
        {
            Name = "HAzEL NUtt"
        };
        Console.WriteLine(myPerson.Name);

        MapperConfiguration configUpper = new MapperConfiguration(cfg => {
            cfg.AddProfile(new UpperCaseProfile());
        });
        IMapper mapperUpper = new Mapper(configUpper);
        Console.WriteLine(mapperUpper.Map<Human>(myPerson).Name);

        MapperConfiguration configLower = new MapperConfiguration(cfg => {
            cfg.AddProfile(new LowerCaseProfile());
        });
        IMapper mapperLower = new Mapper(configLower);
        Console.WriteLine(mapperLower.Map<Human>(myPerson).Name);
    }
}

public class LowerCaseProfile : Profile
{
    public LowerCaseProfile()
    {
        CreateMap<Person, Human>()
                .ForMember(d => d.Name, opt => opt.MapFrom(src => src.Name.ToLower()));
    }
}

public class UpperCaseProfile : Profile
{
    public UpperCaseProfile()
    {
        CreateMap<Person, Human>()
            .ForMember(d => d.Name, opt => opt.MapFrom(src => src.Name.ToUpper()));
    }
}

这是输出:

HAzEL NUtt
HAZEL NUTT
hazel nutt
于 2021-08-20T15:04:38.720 回答