仓储模式和开销..?

3

我想了解有关存储库模式的原则。但是我遇到了另一个问题。在我看来,存储库模式会导致很多开销。

举个例子:

我的实体类看起来像这样:

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年找到的所有新闻项的标题和创建日期的列表。

现在我的问题是,我只使用实体对象的$title和$dateCreated属性。但所有其他属性也被填充了,但我从未使用过它们!这意味着如果getNewsByYear检索到3000条记录,则还会填充永远不会使用的对象中的许多属性... 这不应该是个大问题吗...?当然,如果它是聚合,情况会更糟...

我还不确定的另一件事是:我的仓库是否总是需要返回实体对象?或者当我只需要显示标题或类似内容时,它也可以返回一个字符串..?

2个回答

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();

0

您可以使用临时的DTO数据传输对象)。它是您对象的简化版本,仅包含您查询所需的成员。

例如,您可以使用只包含iddateCreatedEntitySummary,而不是使用所有成员的Entity。当然,这意味着您需要更改接口和服务层以使用此DTO而不是原始对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接