2009-09-01 5 views
0

Я пытаюсь использовать шаблон хранилища для записи уровня доступа к данным в существующей схеме DB2. Эта схема имеет несколько агрегатов, все из которых имеют общую базовую структуру документа. При создании бизнес-объектов я создал объект 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, поэтому я создал еще один абстрактный класс с параметром общего типа для этой функции. Тем не менее, у меня есть блок кодера, который вычисляет, как вернуть экземпляр абстрактного объекта 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; 
    } 
} 

Я все искривлен. Может кто-то, пожалуйста, уверяю меня, что это нормально, или скажите мне, что я идиот и показываю мне лучший способ?

Заранее спасибо.

ответ

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

Все. Боже, спасибо, я не мог думать об этом ради жизни. –