有没有一种很好的方法可以在不同的架构层之间自动翻译对象?

时间:2008-12-05 13:43:22

标签: .net

越来越多的应用程序需要不同类似对象的表示,例如,当与Web服务交叉时或者映射到数据库时。当您使用域模型时,您可能需要业务层/域模型中的一种对象(小的,很多行为),而另一种在跨越流程或网络边界(大的,仅数据)或与数据库交谈时(例如,LINQ to SQL仅支持DB表与生成/映射对象之间的一对一映射。

这意味着您必须编写大量代码来执行将相似对象转换/映射到彼此的死记硬背任务。当然必须有某种框架或工具来帮助你做到这一点?或者手动编码是真正控制的唯一方法?我们已经研究过使用反射和XML /属性映射来解决这个问题,但它很快变得相当复杂,例如,将一个对象上的子对象和列表或几个基元映射到另一个对象上的子对象。

我们在.NET 3.5上使用C#。

2 个答案:

答案 0 :(得分:0)

如果场景允许,您应该始终对接口和抽象进行编码,而不是针对具体类。通过这种方式,您可以拥有一个专用的类/类集,用于处理将一种对象转换为另一种对象 - 例如,适配器模式的行。也许你可以尝试在这个方向上调整你的设计。
是的,我认为手动编码是真正掌控的唯一方法。

答案 1 :(得分:0)

您可以尝试automapper,它是由拥有丰富经验的老C#开发人员Jimmy Bogard开发的。

开始非常容易,只需安装

PM> Install-Package AutoMapper

配置

Mapper.Initialize(cfg => {
    cfg.CreateMap<Foo, FooDto>();
    cfg.CreateMap<Bar, BarDto>();
});

并使用它!

var fooDto = Mapper.Map<FooDto>(foo);
var barDto = Mapper.Map<BarDto>(bar);

编辑

据我了解,问题在于进行对象转换的工具,更具体地说是用于在api中公开信息,接收数据和其他东西的DTO(数据传输对象)。

例如,我可以有一个实体User

class User {
    int Id;
    int UserName;
    int LastUpdate;
}

但是当您的api收到一个对象来添加用户时,您只需要用户名

class AddUserFromApi {
    int UserName;
}

因此,您需要从AddUserFromApi创建一个用户,进行编辑相同

class EditUserFromApi {
    int Id;
    int UserName;
}

您需要编写代码以将一个类转换为另一个类。正如页面上所述,Automapper是专门用于此目的的工具:

  

AutoMapper是一个简单的小库,旨在欺骗性地解决   复杂的问题-摆脱将一个对象映射到的代码   另一个。这种类型的代码很沉闷,无聊,所以   为什么不发明一种工具为我们做呢?