域模型/存储库中的下拉列表

时间:2013-06-20 00:05:30

标签: php architecture domain-driven-design domain-model

我希望能够轻松地在系统中创建从数据库填充的下拉菜单(例如,用户组列表)。我通常遵循这个系统的域驱动设计方法,包括稍微改进的Repository模式版本。 (该系统使用PHP。)

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

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

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

我的主要问题是:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

我建议如下:

  • by-the-book路径(如果性能不是问题)将是方法CategoryRepository :: findAll()/ getAll(),它以Category实例的形式返回所有类别 - 这样你就可以处理严格的业务元素所有层都非常好,因为你没有引入任何中间类型。在视图层中,您可以轻松地将此实例格式化为<option/>元素
  • 自定义方法(如您所建议的)但商业用户可以理解的名称 - 例如getTitlesOfAllCategories()(@ return string []类别ID =&gt;标题的数组)

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

答案 1 :(得分:0)

您应该尽最大努力 来查询您的域名。您的域应该专注于完整的聚合/实体。

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

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

public interface ICategoryQuery
{
    DataTable All();
}

All方法之类的东西通常不会出现在CategoryRepository上,因为域涉及操纵数据(命令端)。因此,如果我们需要对所有我们的类别执行某些操作,以保证All方法,我们可能会遇到设计缺陷。来想一想,这可能表明我们正在查询我们的域名:)