我希望能够轻松地在系统中创建从数据库填充的下拉菜单(例如,用户组列表)。我通常遵循这个系统的域驱动设计方法,包括稍微改进的Repository模式版本。 (该系统使用PHP。)
由于检索给定域对象类的下拉列表是一项常见操作,我想知道在相关存储库上创建getDropDownList()
方法是否合适。
例如,假设有问题的域对象称为“类别”。我建议的是创建一个CategoryRepository::getDropDownList()
方法,该方法将返回类别ID和标题的关联数组,随时可用于创建HTML <select>
列表。
在过去的项目中,当我在类似于类的类上创建getDropDownList()
方法时,其他开发人员之一说这样的方法不属于该类,说它更多地与视图比模型。但我不这么认为,因为该方法的目的只是返回列表的原始数据。它甚至不需要用于创建下拉列表;它可以转换为JSON数据或任何其他数量的东西。
我的主要问题是:
getDropDownList()
方法是否属于存储库类?如果不是,它应该去哪里呢?getSimpleList()
或getArrayForList()
来表示它返回一个数组而不是已经呈现的HTML会更好吗?要继续类别示例,从此方法返回的数据将返回类别ID的关联数组作为键和类别名称作为值,例如:
array(
1 => 'Category A',
2 => 'Category B',
...
)
答案 0 :(得分:1)
恕我直言,你应该寻求每个节目元素的商业含义。视图层只是为了呈现业务规则/数据而应该可以轻松替换。另一方面,您的存储库是业务模型的一部分,并且应该遵循业务命名(业务人员可以理解的名称)。因此,建议的方法命名无效。 “DropDownList”,“SimpleList”和“ArrayForList”对业务负责人没有任何意义。
我建议如下:
<option/>
元素 getDropDownList()的另一个问题是由于命名问题而无法轻松“回收” - 想象突然需要在<ul><li>
列表中列出类别 - 是时候用getBulletedList复制原始方法了()?:)复选框怎么样 - 也许是getCheckboxList()?但是,意思总是一样的,你只想提出...... ta-daaaam ...... 所有类别。
答案 1 :(得分:0)
您应该尽最大努力 来查询您的域名。您的域应该专注于完整的聚合/实体。
而是创建一个单独的查询层,专注于使用某些不可知的命名返回数据。
例如,在C#中我会有这样的东西:
public interface ICategoryQuery
{
DataTable All();
}
All
方法之类的东西通常不会出现在CategoryRepository
上,因为域涉及操纵数据(命令端)。因此,如果我们需要对所有我们的类别执行某些操作,以保证All
方法,我们可能会遇到设计缺陷。来想一想,这可能表明我们正在查询我们的域名:)