2009-09-01 13 views
0

我試圖使用存儲庫模式在現有DB2模式上編寫數據訪問層。該模式具有幾個聚合,所有聚合都具有「文檔」的通用基本實體。在構建業務對象時,我將Document實體創建爲摘要,將聚合作爲從Document派生的實體。例如:爲使用存儲庫模式從相同基礎對象派生的聚合提供通用功能

public abstract class Document 
{ 
    public long Id{ get; set; } 
    public int PageCount{ get; set; } 
    public string Path{ get; set; } 
} 

public class LegalDocument : Document 
{ 
    public int CaseNumber{ get; set; } 
} 

public class BillingDocument : Document 
{ 
    public int InvoiceNumber{ get; set; } 
    public double AmountDue{ get; set; } 
} 

現在,我想創建一個BillingDocument庫,但我知道,我不希望加載的所有在我BillingDocument資源庫中文檔基本屬性的,所以我創造了另一個具有此功能的泛型類型參數的抽象類。但是,我正在讓編碼員的代碼塊弄清楚如何返回抽象文檔實體的實例,這個實例將被我將爲派生聚合實體編碼的存儲庫使用。我可以用反射來做到這一點,如下所示,但感覺都是錯誤的。

abstract class DocumentRepositoryBase<TDocument> 
{ 
    internal Document LoadDocumentBaseProperties(long documentId) 
    { 
     //Call the database and get the base properties and add them to....this? 
     var documentBase = 
      (Document)typeof(TDocument).GetConstructor(Type.EmptyTypes).Invoke(null); 
     //Set the documentBase properties 
     return documentBase; 
    } 
} 

我都扭了起來。有人可以向我保證,這是好的,或告訴我,我是一個白癡,並告訴我一個更好的方法?

在此先感謝。

回答

2

考慮您的存儲庫類型使用通用約束,就像這樣:

abstract class DocumentRepositoryBase<TDocument> 
    // requires it to be a document derivative and have default constructor 
    where TDocument : Document, new() 
{ 
    internal Document LoadDocumentBaseProperties(long documentId) 
    { 
    var doc = new TDocument(); 
    return doc; 
    } 
} 

順便說一句,這不是返回一個抽象類的實例......它返回的任何TDocument可能是一個實例(衍生產品之一),但通過參考基地Document類型。

+0

就是這樣。上帝,謝謝,我無法想象爲了我的生活。 –

相關問題