【发布时间】:2009-02-23 16:56:33
【问题描述】:
我有两个具有父子关系的表,但仍然对如何将其从表映射到类感到困惑。封装方法而不使用业务对象/值对象的简单类。表格是类别和产品。
当一个网络表单列出某个类别的产品时,我应该怎么做?
创建类别对象并调用GetProductsByGroup(int groupId)
或
创建产品对象并调用GetProductsByGroup(int groupId)
哪个类应该拥有该方法?
【问题讨论】:
我有两个具有父子关系的表,但仍然对如何将其从表映射到类感到困惑。封装方法而不使用业务对象/值对象的简单类。表格是类别和产品。
当一个网络表单列出某个类别的产品时,我应该怎么做?
创建类别对象并调用GetProductsByGroup(int groupId)
或
创建产品对象并调用GetProductsByGroup(int groupId)
哪个类应该拥有该方法?
【问题讨论】:
没有。
为什么?
类别:一个类别本身就有意义,它不应该知道任何产品的存在。
产品:一个产品有一个类别,但对同一类别中的其他产品一无所知。
然后呢?
在提供根据规范检索产品的方法(可以称为产品存储库)的服务中。
例子:
public static class ProductRepository
{
public static Collection<Product> GetProductsByGroup(int groupID)
{
...
}
}
【讨论】:
方法的主要关系是什么 - 产品。因此,我将它放在 Products 类中,因为它将处理与产品相关的所有内容。同样,Category 类可能有多种处理、查询和修改类别的方法。
【讨论】:
这几乎取决于你,但我会做出以下区分:
如果方法在 Product 类上,则将其设为静态方法。
如果方法在 Category 类上,不要将其设为静态。
如果您要经常访问它,您可以考虑将其设置为您的 Category 对象上的一个属性,以便延迟加载该类别的 Products。 IE。第一次访问该属性时,它会从数据库中检索 Products 并将它们存储在 Category 对象中;随后的调用只需返回该列表,而无需再次访问数据库。
【讨论】:
简短的回答:两者都不是。你需要一个集合类。
一般来说,一个类将代表一个表中的一行,而一个集合将代表该表或其子集。
如果您不想使用业务或数据层对象(顺便说一句,这将是合适的),那么任何一个类都可以在实践中拥有该方法,但作为 静态方法 .不过,生产类拥有它可能更有意义,因为它应该返回一个产品集合
【讨论】: