基于AutoMapper约定的系统

时间:2011-01-05 20:47:00

标签: c# automapper

我正在尝试将我的ViewModel类映射到Web服务DTO对象。 ViewModels使用以下约定:

CustomerViewModel 
OrderStatusViewModel 

WCF类DTO具有以下约定:

Customer
OrderStatus 

此外,如果WCF类DTO具有以下约定:

CustomerDTO 
OrderStatusDTO 

问题是我如何使用AutoMapper在ViewModel和WCF类之间进行映射?我想以某种方式映射,由于上面的配置,所有未来的ViewModel和WCF类都会自动映射。

2 个答案:

答案 0 :(得分:3)

我在某个时候写过这篇文章。如果您愿意,请查看:http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/

添加对自动提取

的引用

创建基础 ViewModel 类:

public abstract class MappedTo<T>
{
    public MappedTo()
    {
        Mapper.CreateMap(GetType(), typeof(T));
    }

    public T Convert()
    {
        return (T)Mapper.Map(this, this.GetType(), typeof(T));
    }
}

创建一个继承自上述基础的 ViewModel类。指定您要将ViewModel映射到的哪个DTO:

class AddressViewModel : MappedTo<Address>
{
    public string Line1 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}

AutoMapper应该处理剩下的事情:

static void Main(string[] args)
{
    AddressViewModel addressVm = new AddressViewModel
    {
        Line1 = "555 Honolulu Street",
        City = "Honolulu",
        State = "HI"
    };

    Address address = addressVm.Convert();

    Console.WriteLine(address.Line1);
    Console.WriteLine(address.City);
    Console.WriteLine(address.State);
    Console.ReadLine();
}

如果您想获得幻想,可以创建另一个ViewModel基础calss,允许您传入自己的 TypeConverter

public abstract class MappedTo<T, TConverter>
{
    public MappedTo()
    {
        Mapper.CreateMap(GetType(), typeof(T)).ConvertUsing(typeof(TConverter));
    }

    public T Convert()
    {
        return (T)Mapper.Map(this, this.GetType(), typeof(T));
    }
}

然后,您可以从ViewModel转换为您认为合适的DTO:

public class AddressConverter : TypeConverter<AddressViewModel, Address>
{
    protected override Address ConvertCore(AddressViewModel source)
    {
        return new Address
        {
            Line1 = source.Line1 + " foo",
            City = source.City + " foo",
            State = source.State + " foo"
        };
    }
}

答案 1 :(得分:0)

你可以看一下:mvmmapper.codeplex.com 我为Visual Studio编写了一个工具,为您生成映射。

阅读示例以了解该工具的功能,然后决定编写自己的工具或使用现有工具......

编辑:有look at this code它来自MVMMapper并正在生成。它可能会给你一个想法。