实施此业务规则的最佳位置?

时间:2012-08-08 14:43:27

标签: c# design-patterns

我有一个服务调用,它返回给我一个IEnumerable的CustomObject,这是第三方调用,我没有自由修改。可以假定CustomObject具有如下定义:

public class CustomObject
{
    public int Id { get; set; }
    public string Name { get; set; }

    ...
    ...
    ...

    public int Points { get; set; }
    public bool IsPrivate { get; set; }
}

在返回的对象列表中,我可以拥有特殊的CustomObject对象。我需要实现一些特殊规则,例如:

  1. 如果列表中存在ID为1和3的元素,则仅根据规则呈现其中一个元素  一个。如果其中任何一个将IsPrivate标记为true,则显示将IsPrivate设置为false的那个  湾如果两者都没有将IsPrivate设置为true,则显示具有更高点的那个  ......等等。
  2. 实施这些规则的最佳位置是什么。我考虑过实现IEqualityComparer并在我的服务调用上执行.Distinct(),这似乎不是IEqualityComparer的意思。

    建议?

1 个答案:

答案 0 :(得分:2)

由于您无法修改类'CustomObject',我会将业务逻辑添加到'render'管道中,只需调用某些功能,例如下面您应用的特定业务规则。然后从要渲染的对象列表中删除id1和id3,只渲染从以下函数返回的对象。

CustomObject BizRule3293(IEnumerable<CustomObject> objects)
{
    CustomObject id1 = objects.SingleOrDefault(t => t.Id == 1);
    CustomObject id3 = objects.SingleOrDefault(t => t.Id == 3);
    if (id1 != null && id3 !=null)
    {
        if (!id1.IsPrivate && !id3.IsPrivate)
            return id1.Points > id3.Points ? id1 : id3;

        return id1.IsPrivate ? id3 : id1;
        // No logic stated if both are private
    }

    return id1 ?? id3;
}