2012-02-13 58 views
3

我想了解存储库问题的原理。但我偶然发现了另一个问题。对我来说,它看起来像存储库模式导致大量的开销。存储库模式和开销..?

一个例子:

我的实体类如下所示:

class newsEntity 
{ 
    private $title; 
    private $content; 
    private dateCreated; 
    private $author; 
    private $category; // just 1 category possible for simplicity 

    # .. Getter and Setter methods ... 
} 

的仓库看起来像这样(ofcourse简体)

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

现在我的问题是,我只使用Entity对象的$ title和$ dateCreated属性。但所有其他属性也填充了,但我从不使用它们!所以这意味着如果getNewsByYear检索到3000条记录,那么它也会填充一个永远不会被使用的对象中的很多属性......这不应该是一个大问题......?这当然会变得更糟,当它的一个总和...

另一件我不确定的事情是;我的存储库是否总是需要返回一个实体对象?或者它也可以只返回一个字符串,当我只需要显示标题或类似的东西..?

回答

1

我不认为你的存储库只返回简单查询返回的原语或剥离DTOs有问题。在仓库中,您可以使用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

您可以使用临时DTOData Transfer Object)。它是对象的精简版本,只有您的查询所需的成员。

例如,而不是使用Entity及其所有成员,请使用EntitySummary,它只有dateCreated。当然,这意味着你将不得不改变你的接口和服务层来使用这个DTO而不是原始对象。