从DTO创建BO的模式/策略

3

我喜欢使用属性包对象(DTO)来定义与服务器交互的接口,但我不喜欢编写以下代码:

void ModifyDataSomeWay(WibbleDTO wibbleDTO)
{
    WibbleBOWithMethods wibbleBO = new WibbleBOWithMethods();
    wibbleBO.Val1 = wibbleDTO.Val1;
    wibbleBO.Val2 = wibbleDTO.Val2;
}

这个复制代码非常费力编写。如果复制代码是必要的,那么你把它放在哪里?在 BO 中?在工厂中?如果可以手动避免编写样板代码,怎么做呢?

提前感谢。

3个回答

4

看起来需要使用AutoMapper,或者(更简单的方法)只需添加一些接口。


谢谢 - 你能详细说明在这种情况下如何使用接口吗? - ng5000

1
这需要更多的错误处理,您可能需要修改以适应数据类型不匹配的属性,但这显示了一个简单解决方案的本质。
public void CopyTo(object source, object destination)
        {
            var sourceProperties = source.GetType().GetProperties()
                   .Where(p => p.CanRead);
            var destinationProperties = destination.GetType()
                .GetProperties().Where(p => p.CanWrite);
            foreach (var property in sourceProperties)
            {
                var targets = (from d in destinationProperties
                               where d.Name == property.Name
                               select d).ToList();
                if (targets.Count == 0)
                    continue;
                var activeProperty = targets[0];
                object value = property.GetValue(source, null);
                activeProperty.SetValue(destination, value, null);
            }
        }

1

Automapper(或类似工具)可能是这里的前进方向。另一种方法可能是工厂模式。

最简单的方法可能是像这样:

class WibbleBO
{
    public static WibbleBO FromData(WibbleDTO data)
    {
        return new WibbleBO
        {
            Val1 = data.Val1,
            Val2 = data.Val2,
            Val3 = ... // and so on..
        };
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接