具有基类的Fluent Data Builder,将非静态参数传递到基础构造函数中

时间:2014-01-08 12:41:45

标签: c# constructor base-class

基类

public abstract class AbstractAuditBuilder
{
    private readonly AbstractAudit builder;

    protected AbstractAuditBuilder(AbstractAudit builder)
    {
        this.builder = builder;
        this.builder.CreatedId = 1;
        this.builder.CreatedOn = DateTime.Now.AddYears(-1);
    }

    public AbstractAuditBuilder WithCreatedId(int createdId)
    {
        builder.CreatedId = createdId;
        return this;
    }

派生类

public class SaleGroupBuilder : AbstractAuditBuilder
{
    private static readonly SaleGroup saleGroup = new SaleGroup();

    public SaleGroupBuilder() : base(saleGroup)
    {
        saleGroup.SaleGroupId = 1;
        saleGroup.Description = "Miscellaneous";
    }   

 public SaleGroupBuilder WithSaleGroupId(int saleGroupId)
    {
        saleGroup.SaleGroupId = saleGroupId;
        return this;
    }

private SaleGroup Build()
    {
        return saleGroup;
    }

    public static implicit operator SaleGroup(SaleGroupBuilder builder)
    {
        return builder.Build();
    }

使用上面的

public class SeedSaleGroup
{
    public static void Seed(ContextMaster context)
    {
        context.SaleGroup.Add(new SaleGroupBuilder().WithSaleGroupId(1));
        context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Corporates")
        .WithSaleGroupId(2));
        context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Insurance")
        .WithSaleGroupId(3));
        context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Removals")
        .WithSaleGroupId(4));
        context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Self Storage")
        .WithSaleGroupId(5));
        context.SaleGroup.Add(new SaleGroupBuilder().WithDescription("Storage")
        .WithSaleGroupId(6));
    }
}

现在,当我使用Entity Framework 6调用context.SaveChanges()时,它只会保存最后一项,因此在数据库中只有一条记录是一个描述为“存储”的销售组。我相信这是因为我的SaleGroupBuilder类正在创建静态只读的SaleGroup,但是如果我删除关键字static,我会收到以下错误: 非静态字段,方法或属性需要对象引用。

我试过这个:     公共类SaleGroupBuilder:AbstractInformationBuilder     {         私人readonly SaleGroup saleGroup;

    public SaleGroupBuilder(SaleGroup saleGroup) : base(saleGroup)
    {
        this.saleGroup = saleGroup;
        saleGroup.SaleGroupId = 1;
        saleGroup.Description = "Miscellaneous";
    }

然后我像这样使用它:

public class SeedSaleGroup
{
public static void Seed(ContextMaster context)
{
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithSaleGroupId(1));
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Corporates")
    .WithSaleGroupId(2));
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Insurance")
    .WithSaleGroupId(3));
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Removals")
    .WithSaleGroupId(4));
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("SelfStorage")
    .WithSaleGroupId(5));
    context.SaleGroup.Add(new SaleGroupBuilder(new SaleGroup()).WithDescription("Storage")
    .WithSaleGroupId(6));
}
}

这个工作,并将所有记录插入数据库,但我不希望每次都传递新的SaleGroup(),有没有其他方法来实现这一点? 这是我的第一篇文章,所以请问我是否没有正确解释。 谢谢。

2 个答案:

答案 0 :(得分:0)

嗯,很明显,每次打电话给你的工厂修改了同一个对象:

private static readonly SaleGroup saleGroup = new SaleGroup();

每次启动新工厂时都应该创建新对象:

public class SaleGroupBuilder : AbstractAuditBuilder
{
    private readonly SaleGroup saleGroup = new SaleGroup();

    public SaleGroupBuilder() : base(saleGroup)
    {
        saleGroup.SaleGroupId = 1;
        saleGroup.Description = "Miscellaneous";
    }

//...

不确定base调用的内容 - 它看起来不应该在您的示例中编译,但这可能是您省略的另一个细节。或者您可能只是使用误导性名称 - builder而不是objectBeingBuilt

答案 1 :(得分:0)

我可以添加,因为这是我们一起工作的项目,这里的目标是创建许多不同的数据构建器,每个对象一个,每个对象在定义时继承自基类,因为大多数例如,对象具有与CreatedId,CreatedOn,ModifiedId,ModifiedOn相同的属性。理想情况下,我们的数据构建器不希望为每个数据构建器重复WithCreatedId,WithCreatedOn,WithModifiedId,WithModifiedOn方法,因为我们不想重复自己,因此决定拥有一个基类。但是,如果我们将对象新增为静态,我们似乎只能使用基类,除非有人能够以不同的方式提供进一步的洞察力。 HTH进一步阐明了这个问题:)