繁体   English   中英

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

[英]Adding arbitrary properties to a strongly typed list

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

例如,我可能有一个带有类CategoryIdTitleCategory类。 我希望在一页上获取所有类别的列表(即List<Category> )以及每个类别中最昂贵的产品。

不久前,我刚刚返回了一个DataTable,其中包含一些附加列,其中包含了产品数据,但是我尝试不这样做-设置它不是一个好习惯,这很简单。

一种选择是在我的Category类中添加一个MostExpensiveProduct属性,但是在另一种情况下,我可能想显示最近添加的产品,或者显示最便宜的产品,因此我最终要添加很多属性来覆盖所有选项。 这对我来说感觉不对。

我在这里错过了一个把戏吗? 最好的方法是什么? 还是应该只返回一个DataTable,可以向其中添加任意多的列,而不用担心呢?

问题似乎是您想为用户提供许多不同的视图。 我看到的选项是:

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

我确定还有其他我没想到的选择...

HTH。

您应该为每个视图创建一个专门的类(视图模型),只包含您感兴趣的视图中使用的属性。 对于最简单的情况,这似乎是不必要的重复,但是在一致性和层分离方面会有所作为。 您可以手动构建视图模型,或者如果繁琐的话,请使用诸如AutoMapper之类的对象-对象映射框架。

恕我直言,这里有几件事情要考虑。 首先,似乎从Category到Product的唯一引用应该是Category.Products,这意味着您永远不应该具有Category.MostExpensiveProdcut之类的东西。至于您的业务层,我将执行以下操作:

在表示层后面的代码中:

调用CategoryManager.GetCategories();
调用List <Product> ProductManager.GetMostExpensiveProducts(List <Category>);

现在,您已经有了一个类别列表和一个产品列表(假设您的产品具有对其类别的引用),您就可以使用所有必需的信息。 使用此设置,您的实体(类别,产品)不会受到污染。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM