Automapper将映射对象转换为不同类型

时间:2016-08-18 09:19:17

标签: c# .net mongodb automapper

我有一个界面

public interface ILocation {
    double Longitude { get; set; }
    double Latitude { get; set; }
}

和两个继承自此的类,都在不同的项目中(两个类都相同)

namespace Mvc {
    [DataContract]
    public class Location : ILocation {
        [DataMember(Name = "longitude")
        public double Longitude { get; set; }
        [DataMember(Latitude = "latitude")
        public double Latitude { get; set; }
    }
}
namespace Storage {
    public class Location : ILocation {
        [BsonElement("longitude")
        public double Longitude { get; set; }
        [BsonElement("latitude")
        public double Latitude { get; set; }
    }
}

有一个包含此ILocation的类,ILocation是该类的属性,例如。

public interface IVehicle {
    ILocation Location { get; set; }
}

namespace Mvc {
    [DataContract]
    public class Vehicle : IVehicle {
        [DataMember(Name = "location")
        public ILocation Location { get; set; }
    }
}

namespace Storage {
    public class Vehicle : IVehiche {
        [BsonElement("location")
        public ILocation Location { get; set; }
    }
}

该类从一个项目传递到另一个项目(MVC稍后传递到存储层),并通过接口从MVC层传递到存储层。

我使用Automapper从界面映射到具体类,因此我可以在序列化时访问属性。

MapperConfiguration configuration = new MapperConfiguration(config => {
    config.CreateMap<IVehicle, Storage.Vehicle>();
    config.CreateMap<ILocation, Storage.Location>();
};
Mapper mapper = configuration.CreateMapper();

要从存储项目中的接口转换为具体类,我使用

Vehicle vehicle  = mapper.Map<IVehicle, Storage.Vehicle>(data);

然后我将数据存储到我的存储(mongodb)中,并将车辆属性存储为“位置”字段名称,这是正确的。但是,Location的属性存储为'Longitude'和'Latitude'(大写的第一个字母),这是不正确的,因为我有两个属性存储为小写。

调试车辆变量时,我查看位置属性,它不是Storage.Location类型,而是类型Mvc.Location。但是我告诉Automapper将其映射到Storage.Location。 在Automapper配置中,我尝试了config.CreateMap<IVehicle, Storage.Vehicle>().As<Storage.Vehicle>;但仍然没有运气。

如何让Automapper将所有嵌套属性强制转换为指定的正确类型?我见过TypeConverters但是我还没有看到一个通用的,我可以将源和目标类型传递给它,它会为我转换它,我似乎必须为每种类型指定一个,这将变得非常大在我正在建设的应用程序中。

0 个答案:

没有答案