我正在尝试使用Repository Pattern在现有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创建一个Repository,但我知道我不想在我的BillingDocument存储库中加载所有Document基本属性,所以我创建了另一个带有泛型类型参数的抽象类这个功能。但是,我正在编写程序块来确定如何返回抽象文档实体的实例,这将由存储库使用,我将为派生的聚合实体编写代码。我可以用反射做,如下,但感觉都错了。
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;
}
}
我都被扭曲了。有人可以向我保证这没关系,或者告诉我我是个白痴,并告诉我一个更好的方法吗?
提前致谢。
答案 0 :(得分: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
可能是(衍生物之一)的实例,但是通过对基类{{1}的引用} type。