我正在努力理解存储库问题的原理。但我偶然发现了另一个问题。对我来说,看起来存储库模式会导致很多开销。
一个例子:
我的实体类看起来像这样:
class newsEntity
{
private $title;
private $content;
private dateCreated;
private $author;
private $category; // just 1 category possible for simplicity
# .. Getter and Setter methods ...
}
存储库看起来像这样(简化的课程)
class newsRepository
{
public function getNewsByYear ( $year )
{
$newsList = array();
// Some ORM code which fills $newsList with newsEntity objects
}
}
客户端代码如下所示:
$repo = new newsRepository();
$news = $repo->getNewsByYear(2011);
foreach ( $news as $item )
echo $item->getTitle() . " " . $item->getDateCreated();
这只是显示了2011年可以找到的所有新网站的列表,其中包含标题和创建日期。
现在我遇到的问题是,我只使用Entity对象的$ title和$ dateCreated属性。但是所有其他属性也被填充,但我从不使用它们!所以这意味着如果getNewsByYear检索3000条记录,它还会填充一个永远不会被使用的对象中的很多属性......这不应该是一个大问题......?当它是一个聚合时,这种情况会变得更糟......
另一件我不确定的事情是;我的存储库是否总是需要返回一个Entity对象?或者当我只需要显示标题或类似的东西时,它还可以返回一个字符串.. ???
答案 0 :(得分:1)
我认为您的存储库只返回原语或剥离DTO以进行简单查询时出现问题。在存储库中,您可以使用ORM加载所需的字段。您不必预加载整个对象。
class newsOverviewDto
{
private $title;
private $dateCreated;
// + Getters/Setters
}
class newsRepository
{
public function getNewsByYearForOverview ( $year )
{
$newsList = array();
// Some ORM code which fills $newsList with
// DTOs that contain title and date
}
}
// Usage:
$repo = new newsRepository();
$newsOverviewDtos = $repo->getNewsByYearForOverview(2011);
foreach ( $newsOverviewDtos as $item )
echo $item->getTitle() . " " . $item->getDateCreated();
答案 1 :(得分:0)
您可以使用临时 DTO (Data Transfer Object)。它是对象的简化版本,只有您查询所需的成员。
例如,您使用的Entity
只使用EntitySummary
而不是dateCreated
。当然,这意味着您必须更改接口和服务层才能使用此DTO而不是原始对象。