2015-09-08 1 views
0

У меня есть «чувство», что мой проект вызывает метод загрузки данных внутри конструктора, является неправильным.Конструктор Конструкция - Загрузка данных внутри конструктора (C#)

Я пытаюсь написать класс, который предоставляет основную логику для расчета (скидка, налога, общей суммы и т. Д.) Для счетов-фактур, заказов или кавычек. В большинстве случаев тот же набор необходимых атрибутов (например, атрибут «количество» присутствует во всех сущностях/таблицах).

В моем текущем дизайне использует этот базовый класс (обратите внимание, что это не реальный код, я нахожусь дома и не имею доступ к кодовой базе, поэтому опечатки, скорее всего):

public abstract class HeadCalculationEngineBase 
{ 
    protected readonly IOrganisationService orgService; 
    protected decimal pricePerUnit; 
    protected decimal quantity; 

    public HeadCalculationEngineBae(Guid entityid, IOrganisationService service) 
    { 
     this.orgService = service; 
     this.populate(this.loadEntityData(id)); 
    } 

    public virtual Entity loadEntityData(Guid id) 
    { 
     var columns = new ColumnSet("pricePerUnit", "quantity"); 

     return this.orgService.Retrieve(id, columns); 
    } 

    protected virtual populate(Entity data) 
    { 
     this.pricePerUnit = data["pricePerUnit"]; 
     this.quantity = data["quantity"]; 
    } 
} 

Такая конструкция дает мне возможность переопределить виртуальный член и загрузить дополнительные атрибуты для моей реализации для объекта счета:

public class HeadCalculationInvoiceEngine : HeadCalculationEngineBase 
{ 
    protected decimal discount; 

    public HeadCalculationInvoiceEngine(Guid entityid, IOrganisationService service) 
     :base(entityid, service) 
    { } 

    public override Entity loadEntityData(Guid id) 
    { 
     var columns = new ColumnSet("pricePerUnit", "quantity", "discount"); 

     return this.orgService.Retrieve(id, columns); 
    } 

    protected override populate(Entity data) 
    { 
     this.pricePerUnit = data["pricePerUnit"]; 
     this.quantity = data["quantity"]; 
     this.discount = data["discount"]; 
    } 
} 

Так что моя проблема сводится к вопросу: Должен ли я загрузить данные внутри конструктора?

+0

Виртуальные вызовы методов в конструкторе могут быть проблематичными - http://stackoverflow.com/a/119543/16391 – StingyJack

ответ

3

Лучше сохранить конструкторы в легком и избегать длинных и особенно удаленных вызовов.

  • Ошибки в конструкторе сложнее рассуждать, чем исключения, брошенные методами.
  • сложнее выполнить такую ​​функциональность для модульного теста (например, вы не можете извлечь конструктор для интерфейса)
  • конструкторы не могут быть асинхронными - поэтому, когда вы пытаетесь переключиться на современные асинхронные API-интерфейсы для доступа к удаленным ресурсам, вы вам придется значительно изменить способ построения объектов.
Смежные вопросы