Oop 构建对象-静态生成器方法与生成器类与扩展方法

Oop 构建对象-静态生成器方法与生成器类与扩展方法,oop,design-patterns,Oop,Design Patterns,我很想知道是否有人对使用另一个对象的数据构建自定义对象有任何建议或替代模式 我们目前正在探索三种方法 1)静态构建方法 public class MyObject { public int Id { get; set; } public string Name { get; set; } public static MyObject Build(DataRow data) { MyObject newObject = new MyObject();

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

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

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;
    }
}
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"]);
    }
}
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 MyObject Build(DataRow data)
    {
        MyObject newObject = new MyObject();
        newObject.Id = Convert.ToInt32(data["ID"]);
        newObject.Name = Convert.ToString(data["NAME"]);
        return newOjbect;
    }
}
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"]);
    }
}
一个主要考虑因素是,无论采用哪种方法,我们都需要使用
System.Data
引用向类中添加
。此时,我们对直接将此依赖项添加到
MyObject
类中犹豫不决


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

第一种方法的缺点是将对象定义与生成器逻辑混淆。考虑到您选择的总体架构,您可能更愿意将模型对象保持为POCO,因此不在其中定义复制逻辑

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


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

您可以使用构造函数

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)
我认为扩展方法不合适,因为对象的创建和状态有关,但和行为无关,而扩展方法和对象的行为有关