从DTO创建BO的模式/策略

时间:2010-06-26 08:03:07

标签: c# wcf web-services design-patterns

我喜欢使用属性包对象(DTO)定义服务器接口的方法,但我不喜欢编写这样的代码:

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

这种复制代码很难编写。如果复制代码是不可避免的,那么你把它放在哪里?在BO?在工厂?如果可以手动避免写锅炉板代码那么怎么办?

提前致谢。

3 个答案:

答案 0 :(得分:4)

这看起来像AutoMapper的工作,或者(更简单)只添加一些接口。

答案 1 :(得分: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);
            }
        }

答案 2 :(得分:1)

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

最简单的就是这样:

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