DDD为每个函数修改多个对象(通过引用传递)

时间:2013-11-18 05:18:55

标签: c# domain-driven-design

我在根实体(类型为ProductOptionGroup)中有一个方法,它在对另一个对象(目标,同样类型为ProductOptionGroup)的引用上设置属性。

我必须通过引用传入,因为目标变量在以下方法片段中被修改:

void SetOptionDependency(Product sourceProduct, Product targetProduct, ref ProductOptionGroup target)
{
    if (this.targetDependencyId == null)
    {
        this.targetDependencyId = target.Id;
    }

    if (this.targetDependencyId != target.Id)
    {
        // abort - reassignement of active dependency not allowed
    }

    if (this.map.Contains(sourceProduct.Id) == false)
    {
        // abort - the provided id is not associated with us
    }

    if (target.map.Contains(targetProduct.Id) == false)
    {
        // abort - the supplied id is not associated with the dependency target
    }

    // ** here the parameter passed in is modified **
    target.associationCount[targetProduct.Id]++;

    this.map.Add(sourceProduct.Id, targetProduct.Id);
}

我已将代码放在ProductOptionGroup聚合中,因为业务规则最容易在那里阅读。

我想替代方案可能是使用域服务来建立关联,但是然后一些业务逻辑和检查将来自实体并进入服务。我不确定我是否喜欢这个想法。

我看到的缺点是谁曾在实体上调用方法,需要确保保存实体,同时保存通过引用修改的对象 - 方法上的ref关键字给出了一个很大的暗示,但并不明确。

我的问题是修改通过引用实体方法传入的变量是否违反任何DDD规则?

如果需要,请提供更好的上下文,完整的代码段落如下:

public class ProductOptionGroup
{
    string Id; // our Id
    string targetDependencyId; // we can link to one other ProductOptionsGroup by reference

    MapList<string, string> map = new MapList<string, string>();

    Dictionary<string, int> associationCount = new Dictionary<string, int>();

    void AssociateProduct(Product product)
    {
        this.map.AddKey(product.Id);
    }

    void DisassociatedProduct(Product product)
    {
        if (this.map.Contains(product.Id) == false)
        {
            // abort - the provided id is not associated with us
        }

        // check children are not referring to this product
        int count = 0;

        if (this.associationCount.TryGetValue(product.Id, out count) && count > 0)
        {
            // abort - this product is being referenced
        }
        else
        {
            this.map.Remove(product.Id);
        }
    }

    void SetOptionDependency(Product sourceProduct, Product targetProduct, ref ProductOptionGroup target)
    {
        if (this.targetDependencyId == null)
        {
            this.targetDependencyId = target.Id;
        }

        if (this.targetDependencyId != target.Id)
        {
            // abort - reassignement of active dependency not allowed
        }

        if (this.map.Contains(sourceProduct.Id) == false)
        {
            // abort - the provided id is not associated with us
        }

        if (target.map.Contains(targetProduct.Id) == false)
        {
            // abort - the supplied id is not associated with the dependency target
        }

        target.associationCount[targetProduct.Id]++;

        this.map.Add(sourceProduct.Id, targetProduct.Id);
    }
}

1 个答案:

答案 0 :(得分:0)

总之我已经总结了修改另一个函数内部函数内部的一个变量的状态真是个坏消息,我认为这是一个副作用。

正如评论中所提到的,需要一次修改多个内容指向更深入的域洞察,等待探索以允许更自然,更干净的模型和相关代码。

https://softwareengineering.stackexchange.com/questions/40297/what-is-a-side-effect