代码之家  ›  专栏  ›  技术社区  ›  ng5000

从DTO创建BOS的模式/策略

  •  3
  • ng5000  · 技术社区  · 14 年前

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

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

    这种复制代码编写起来相当费力。如果复制代码是不可避免的,那么您将把它放在哪里?在微博里?在工厂里?如果可以手动避免编写锅炉板代码,那么如何?

    提前谢谢。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Marc Gravell    14 年前

    那看起来像是一份工作 AutoMapper 或者(更简单)只添加一些接口。

        2
  •  1
  •   Nick Harrison    14 年前

    这需要更多的错误处理,您可能需要修改它以适应数据类型不匹配的属性,但这显示了简单解决方案的本质。

    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);
                }
            }
    
        3
  •  1
  •   MattDavey    14 年前

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

    最简单的就是这样:

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