代码之家  ›  专栏  ›  技术社区  ›  philwilks

向强类型列表添加任意属性

  •  1
  • philwilks  · 技术社区  · 15 年前

    我正在寻找一种向强类型列表中的对象添加任意属性的好方法,基于这样的原则:我不应该将数据表从业务层传递到表示层。

    例如,我可能有一个 类别 用属性初始化 分类ID 书名 . 在一个页面上,我想获取所有类别的列表(即 List<Category> )以及每个类别中最昂贵的产品。

    前一段时间,我刚返回了一个数据表,其中包含一些包含产品数据的附加列,但我尝试不这样做——设置它是不好的做法。

    一种选择是添加 大多数消费品 财产归我所有 类别 类,但我可能希望在另一种情况下显示最近添加的产品,或最便宜的产品,所以我最终会添加许多属性来涵盖所有选项。这对我来说是不合适的。

    我错过了一个技巧吗?最好的方法是什么?或者我应该返回一个数据表,我可以根据需要添加尽可能多的列,而不必担心它?

    3 回复  |  直到 14 年前
        1
  •  0
  •   Brian Mains    15 年前

    问题似乎是你有很多不同的观点,你想提供给用户。我看到的选项有:

    • 可以为从类别类继承的每个视图构造单独的类。在这里,代码生成是一个很好的解决方案。
    • 可以存储具有IDictionary接口的属性属性,并按键引用项。我正在成为这种方法的粉丝。
    • 您只能为绑定目的生成数据表,用于这些视图…或者开发一个类似组件的数据表,您可以在其中按键引用字段…
    • 对于计算的字段(例如存储增值税和净价,并计算总成本),可以将其存储为类别对象的方法,也可以存储为扩展方法。

    我相信还有其他的选择我没有想到…

    Hth.

        2
  •  0
  •   janerist    15 年前

    您应该为您拥有的每个视图创建一个专门的类(视图模型),该类只包含您感兴趣在视图中使用的属性。对于最简单的情况,这似乎是不必要的重复,但在层的一致性和分离方面是有回报的。您可以手动构建视图模型,或者,如果这变得单调乏味,那么使用对象对象映射框架,例如 AutoMapper .

        3
  •  0
  •   e36M3    14 年前

    这里有几件事要考虑。首先,似乎从类别到产品的唯一参考应该是类别。产品,也就是说,你不应该有类别。大多数情况下,就你的业务层而言,我会这样做:

    从表示层中的代码隐藏:

    调用categoryManager.getCategories();
    呼叫列表<product>productManager.getMostexPensiveProducts(list<category>);

    现在,您有了一个类别列表和一个产品列表(假设您的产品引用了它的类别),您就有了所有需要处理的信息。使用此设置,您的实体(类别、产品)不会受到污染。

    另一个需要考虑的问题是引入一个服务层。如果你发现你不想(出于任何原因)打两个电话给业务经理,而是想打一个电话,一次就得到你所有的信息,我会考虑引入一个服务层,有时也称为“应用程序外观”。这个外观将负责对业务经理进行单独的调用,并将结果组合成一个响应,然后再将其发送回UI层。有人提到自定义对象将是一个“viewmodel”,它是正确的,但经常用于引用MVC。它的另一个名称是DTO(数据传输对象),设计用于服务层/应用程序外观。