0

我想让在我的系统中创建从数据库填充的下拉菜单变得容易(例如,用户组列表)。对于这个系统,我通常遵循领域驱动的设计方法,包括稍微适应版本的存储库模式。(系统是 PHP 的。)

由于检索给定域对象类的下拉列表是一种常见操作,我想知道getDropDownList()在相关存储库上创建方法是否合适。

例如,假设有问题的域对象称为“类别”。我的提议是创建一个CategoryRepository::getDropDownList()方法,该方法将返回类别 ID 和标题的关联数组,准备好用于创建 HTML<select>列表。

在过去的一个项目中,当我在getDropDownList()类似存储库的类上创建一个方法时,其他开发人员之一说这样的方法不属于该类,说它与视图有关,而不是与模型有关。但我不这么认为,因为该方法的目的只是返回列表的原始数据。它甚至不需要用于创建下拉列表;它可以转换为 JSON 数据或任何其他数量的东西。

我的主要问题是:

  1. 像我描述的那样的方法是否getDropDownList()属于存储库类?如果没有,它应该去哪里?
  2. 这可能只是一个命名问题吗?getSimpleList()如果我称它为或getArrayForList()表示它正在返回一个数组而不是已经呈现的 HTML,也许会更好?

继续类别示例,从此方法返回的数据将返回类别 ID 作为键和类别名称作为值的关联数组,例如:

array(
    1 => 'Category A',
    2 => 'Category B',
    ...
)
4

2 回答 2

1

您应该尽最大努力不要查询您的域。您的域应该集中在完整的聚合/实体上。

而是创建一个单独的查询层,专注于使用一些不可知的命名返回数据。

例如,在 C# 中我会有这样的东西:

public interface ICategoryQuery
{
    DataTable All();
}

诸如All方法之类的东西不是您通常会在 a 上找到的东西,CategoryRepository因为域涉及操作数据(命令端)。因此,如果我们需要频繁地对所有类别执行某些操作以保证一种All方法,那么我们可能存在设计缺陷。想一想,这可能表明我们正在查询我们的域:)

于 2013-06-20T04:47:43.337 回答
1

恕我直言,您应该寻找每个程序元素的商业意义。视图层只是为了呈现业务规则/数据而存在,应该很容易替换。另一方面,您的存储库是业务模型的一部分,并且绝对应该遵循业务命名(业务人员可以理解的名称)。因此,您建议的方法命名无效。“DropDownList”、“SimpleList”和“ArrayForList”对业务负责人没有任何意义。

我建议如下:

  • 按书路径(如果性能不是问题)将是方法 CategoryRepository::findAll()/getAll() 以 Category 实例的形式返回所有类别 - 这样您就可以处理所有层的严格业务元素非常好,因为您没有引入任何中间类型。在视图层中,您可以轻松地将这些实例格式化为<option/>元素
  • 自定义方法(如您所建议的),但名称可以被业务人员理解 - 例如 getTitlesOfAllCategories() (@return string[] Array of category ID => title)

getDropDownList() 的另一个问题是,由于命名问题,它不能轻易“回收”——想象一下突然需要在列表中列出类别<ul><li>——是时候用 getBulletedList() 复制你的原始方法了吗?:) 复选框呢- 也许 getCheckboxList()?但是,意思总是一样的,你只是想呈现... ta-daaaam...所有类别

于 2013-06-21T13:41:00.460 回答