2016-08-03 41 views
0

我將舊的VB6代碼(是的,VB6 ...)移植到C#中。我將代碼重構爲面向對象,除此之外,我正在實現存儲庫類來訪問數據庫。OOP/Repository模式:爲不同的數據庫訪問子集創建太多的對象?

現在,這些存儲庫類將返回對象,而不是數據集。但是我發現有時我只返回一個對象可能持有的信息的一部分。例如:我可以得到完整的文檔列表,包括名稱,文件路徑,文件夾,創建者等 - 或者我可以獲取僅包含名稱和文件夾的文檔搜索結果。

這些子集案例的最佳做法是什麼?我應該爲這些數據庫調用創建自定義對象嗎,它只包含數據的子集?我是否應該只填寫其中一些字段來返回完整的對象?或者我應該只返回數據集?

+0

只是一個想法。您的庫中,應當永遠返回一個'DataSet'。他們應該返回像波科一樣的東西。 poco應該匹配TableStructure。像ORM-Mapper或EntityFramework可能會有所幫助 – lokusking

回答

0

理想情況下,應儘可能集中所有內容。這可以通過爲每個子集創建一個查詢對象來完成。我認爲如果你的數據庫允許這些特定字段的空值,你可以用任何方式返回帶有填充字段的返回對象或者空值。

因此,將您的規則和邏輯與存儲庫類集中在一起,以便每個對象都基於這些規則和邏輯一致地返回。

爲您的對象創建一個下屬模式,這樣它們不會太複雜。我認爲需要爲存儲庫考慮每個對象的實體。同樣,創建自定義對象或DTO可能會產生不必要的代碼和複雜性。爲了保持完整性,請將對象填充一些填充的字段,將其中不需要的其他對象填充爲null,這樣,如果稍後查詢此信息,則可以將信息報告回來,該值對於特定實體不存在。

下面是一個簡單的例子,嘗試在實體框架中使用POCO類。 POCO類

public interface IRepository<TEntity, in TKey> where TEntity : class 
{ 
    TEntity Get(TKey id); 
} 

public class SomeRepo1 : IRepository 
{ 
    private readonly FileDbContext someDbContext; 

    public FileRepository(FileDbContext dbContext) 
    { 
     someDbContext = dbContext; 
    } 

    public File Get(string id) 
    { 
    return someDbContext.Files.ToList(); 
    } 
} 

的例子,可以用於文件:

public class File 
{ 
    public int Id { get; set; } 
    public string FileName { get; set; } 

} 
public class Folder 
    { 
    public List<File> Files { get; set; } 

    } 

更多細節在這裏:https://msdn.microsoft.com/en-us/library/ff649690.aspx

希望這有助於!

0

但我發現有時我只返回一個對象可能持有的信息的子集。

您剛剛將對象模型與持久性模型混淆了。

您會發現,對象模型並不關心存儲是如何實現的。特別是,如果在對象模型後面有一個數據庫,並且您有包含一些數據的表,則可以以任何您想要的方式自由將數據庫映射到對象模型。藉助巧妙的對象關係映射器,您可以將表分成兩個類,或者將多個類保存在同一個表中。

因此,從您的存儲角度看起來像「子集」的東西,可能不是從對象模型角度來看的「子集」。

一個例子特定實體框架6的解決方案涉及所謂表分裂它允許你模型類分裂成兩個類,具有核心屬性的類即總是被載入,並與輔助特性另一類被懶惰地僅加載當你引用核心類的虛擬屬性時。

一個實例教程:http://www.c-sharpcorner.com/UploadFile/ff2f08/table-splitting-in-entity-framework-6-code-first-approach/

(只提,相反,在兩個物理表映射到OE模型類被稱爲實體分裂