我正在寻找一种向强类型列表中的对象添加任意属性的好方法,这是基于我不应该将DataTable从业务层传递到表示层的原则。
例如,我可能有一个类别类,其属性为 CategoryId 和标题。在一个页面上,我想获取所有类别的列表(即List<Category>
)以及每个类别中最昂贵的产品。
前一段时间,我刚刚返回了一个DataTable,其中包含一些额外的列,其中包含产品数据,但我不想这样做 - 设置它并不是一件好事。
一种选择是将 MostExpensiveProduct 属性添加到我的类别类,但我可能希望在另一种情况下显示最近添加的产品,或者最便宜的产品,所以我最终会添加很多属性来涵盖所有选项。这对我来说感觉不对。
我在这里错过了一招吗?这样做的最佳方式是什么?或者我应该只返回一个DataTable,我可以根据需要添加多列,而不用担心它?
答案 0 :(得分:0)
问题似乎是您希望为用户提供许多不同的观点。我看到的选项是:
我确信还有其他选择我没想过......
HTH。
答案 1 :(得分:0)
您应该为每个视图创建一个专门的类(视图模型),该视图仅包含您在视图中使用的属性。对于最简单的情况,这似乎是不必要的重复,但在一致性和层分离方面会有所回报。您可以手动构建视图模型,或者如果这样做很繁琐,请使用像AutoMapper这样的对象 - 对象映射框架。
答案 2 :(得分:0)
这里有几件事要考虑恕我直言。首先,似乎从Category到Product的唯一引用应该是Category.Products,这意味着你永远不应该有像Category.MostExpensiveProdcut等。就业务层而言,我会做这样的事情:
从表示层中的代码开始:
调用CategoryManager.GetCategories();
call List&lt; Product&gt; ProductManager.GetMostExpensiveProducts(List&lt; Category&gt;);
现在您有一个类别列表和一个产品列表(假设您的产品有一个返回其类别的参考),您可以获得所有必要的信息。使用此设置,您的实体(类别,产品)不会受到污染。
要考虑的另一件事是引入服务层。如果您发现您不希望(无论出于何种原因)向业务经理打两次电话,而您想要一次性拨打电话并获取所有信息,我会考虑引入服务层,有时也称为“应用程序”正面”。此外观将负责向业务经理进行单独调用,并将结果合并到一个响应中,然后再将其发送回UI层。有人提到该自定义对象将是“ViewModel”,这是正确的,但通常用于引用MVC。它的另一个名称是DTO(数据传输对象),它设计用于服务层/应用程序外观。