存储库模式和开销..?

时间:2012-02-13 11:33:15

标签: design-patterns repository-pattern

我正在努力理解存储库问题的原理。但我偶然发现了另一个问题。对我来说,看起来存储库模式会导致很多开销。

一个例子:

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

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对象?或者当我只需要显示标题或类似的东西时,它还可以返回一个字符串.. ???

2 个答案:

答案 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而不是原始对象。