构造函数设计 - 在构造函数中加载数据(C#)

时间:2015-09-08 19:38:42

标签: c# constructor

我有“感觉”我的设计调用一个方法在构造函数中加载数据是不对的。

我尝试编写一个类,为发票,订单或报价记录提供执行计算(折扣,税金,总金额等)的基本逻辑。 在大多数情况下,需要相同的属性集(例如,属性“数量”存在于所有实体/表中)。

在我目前的设计中使用这个基类(请注意,这不是真正的代码,我在家里并且无法访问代码库,因此可能存在拼写错误):

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

所以我的问题归结为一个问题:我应该在构造函数中加载数据吗?

1 个答案:

答案 0 :(得分:3)

最好保持构造函数的轻量级,避免长时间的远程调用。

  • 构造函数中的失败比方法引发的异常更难以推理。
  • 为单元测试模拟这样的功能更难(例如,你不能将构造函数提取到接口)
  • 构造函数不能是异步的 - 因此当您尝试切换到现代异步API以访问远程资源时,您必须显着修改构造对象的方式。