代码之家  ›  专栏  ›  技术社区  ›  AJ.

使用存储库模式为从同一基本对象派生的聚合提供公共功能

  •  0
  • AJ.  · 技术社区  · 17 年前

    我试图使用Repository模式在现有DB2模式上编写数据访问层。这个模式有几个聚合,所有聚合都有一个“文档”的公共基础实体。在构建业务对象时,我将文档实体创建为抽象,并将聚合创建为从文档派生的实体。例如:

    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存储库中加载所有文档库属性,因此我为这个功能创建了另一个带有泛型类型参数的抽象类。然而,我正在让coder's block研究如何返回抽象文档实体的实例,我将为派生聚合实体编写代码的存储库将使用该实例。我可以用反射来做,如下所示,但感觉完全错了。

    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;
        }
    }
    

    提前谢谢。

    1 回复  |  直到 17 年前
        1
  •  2
  •   LBushkin    17 年前

    考虑在存储库类型中使用泛型约束,如下所示:

    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 类型