[英]Adding arbitrary properties to a strongly typed list
基于不应该将DataTable从我的业务层传递到表示层的原则,我正在寻找一种向强类型列表中的对象添加任意属性的好方法。
例如,我可能有一个带有类CategoryId和Title的Category类。 我希望在一页上获取所有类别的列表(即List<Category>
)以及每个类别中最昂贵的产品。
不久前,我刚刚返回了一个DataTable,其中包含一些附加列,其中包含了产品数据,但是我尝试不这样做-设置它不是一个好习惯,这很简单。
一种选择是在我的Category类中添加一个MostExpensiveProduct属性,但是在另一种情况下,我可能想显示最近添加的产品,或者显示最便宜的产品,因此我最终要添加很多属性来覆盖所有选项。 这对我来说感觉不对。
我在这里错过了一个把戏吗? 最好的方法是什么? 还是应该只返回一个DataTable,可以向其中添加任意多的列,而不用担心呢?
问题似乎是您想为用户提供许多不同的视图。 我看到的选项是:
我确定还有其他我没想到的选择...
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.