2013-04-24 24 views
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類中。

任何人都可以提供這些方法的優點或缺點,或者提供可以更好地實現可擴展性和可測試性的替代方案嗎?

回答

6

第一種方法的缺點是您將對象定義與構建器邏輯混淆在一起。考慮到您選擇的整體架構,您可能希望將模型對象保留爲POCO,因此不需要在其中定義複製邏輯。

我不會使用擴展方法,因爲它們在我看來,當您需要通過所有項目的特定功能時,擴展框架的功能(通常是字符串或IEnumerable類)更具相關性。

所以第二個解決方案很有趣,因爲它允許您將對象定義從構建邏輯中分離出來。但是,您可能會考慮要應用這些對象的數量。如果你有很多人,它可能會變得一團糟。

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) 

我想擴展方法不適合,因爲對象的創建有關的狀態,而不是行爲,而擴展方法與對象的行爲。