我很想知道是否有人对使用另一个对象的数据构建自定义对象有任何建议或替代模式。
我们目前正在探索三种方法。
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
类中。
任何人都可以提供这些方法的优点或缺点,或者提供更好地实现可扩展性和可测试性的替代方案吗?
第一种方法的缺点是您将对象定义与构建器逻辑混合在一起。考虑到您选择的整体架构,您可能更愿意将模型对象保留为 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)
我认为扩展方法不适合,因为对象的创建与状态相关,但与行为无关,而扩展方法与对象的行为相关。