7

我很想知道是否有人对使用来自另一个对象的数据构建自定义对象有任何建议或替代模式。

我们目前正在探索三种方法。

1) 静态构建方法

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public static MyObject Build(DataRow data)
    {
        MyObject newObject = new MyObject();
        newObject.Id = Convert.ToInt32(data["ID"]);
        newObject.Name = Convert.ToString(data["NAME"]);
        return newOjbect;
    }
}

2) 生成器类

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MyObjectBuilder
{
    public static MyObject Build(DataRow data)
    {
        MyObject newObject = new MyObject();
        newObject.Id = Convert.ToInt32(data["ID"]);
        newObject.Name = Convert.ToString(data["NAME"]);
        return newOjbect;
    }
}

3) 扩展方法

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public static class MyObjectExtensions
{
    public static void Build(this MyObject obj, DataRow data)
    {
        obj.Id = Convert.ToInt32(data["ID"]);
        obj.Name = Convert.ToString(data["NAME"]);
    }
}

一个主要考虑因素是,无论我们采用哪种方法,都需要添加对类的using引用System.Data。在这一点上,我们犹豫是否将这个依赖直接添加到我们的MyObject类中。

任何人都可以为这些方法中的任何一种提供优点或缺点,或者提供可以更好地实现可扩展性和可测试性的替代方案吗?

4

2 回答 2

6

第一种方法的缺点是您将对象定义与构建器逻辑混为一谈。考虑到您选择的整体架构,您可能更愿意将模型对象保留为 POCO,因此没有在其中定义复制逻辑。

我也不会使用扩展方法,因为在我看来,当您在所有项目中需要特定功能时,它们与从框架中扩展功能(通常是字符串或 IEnumerable 类)更相关。

所以第二个解决方案很有趣,因为它允许您将对象定义与构建逻辑分开。但是,您可能会考虑要应用此功能的对象数量。如果你有很多,维护起来可能会变得一团糟。

于 2013-04-24T16:41:51.443 回答
2

您可以使用构造函数

public class MyObject
{
    public int Id { get; private set; }
    public string Name { get; private set; }

    public MyObject(int Id,string Name)
    {
        this.Id = Id;
        this.Name = Name;
    }

    public MyObject(DataRow data)
    {
        Id = Convert.ToInt32(data["ID"]);
        Name = Convert.ToString(data["NAME"]);
    }
}

如果Id类型是Guid可以有默认构造函数。

MyObject myObject = new MyObject(data) 

看起来更具可读性

MyObject myObject = MyObject.Build(data)

我认为扩展方法不适合,因为对象的创建与状态有关,但与行为无关,而扩展方法与对象的行为有关。

于 2013-04-25T12:47:12.633 回答