DDD存储库中的过滤器

kam*_*mal 9 domain-driven-design

有Campaign实体,为此,我有CampaignRepository,它有这个功能

  1. public IList FindAll();
  2. public Campaign FindByCampaignNumber(字符串编号);

但现在我想要这个标准 - :

  1. 查找今天创建的广告系列.
  2. 查找本月创建的广告系列
  3. 查找前5个最新广告系列.
  4. 查找今年创建的广告系列.

对于所有这些广告系列过滤器,

我是否在存储库中为每个人创建了单独的功能?

并以这种方式实施.

Getall广告系列然后过滤所需的广告系列,但我不想要所有广告系列.在谷歌搜索我发现这个解决方案

1:http://russelleast.wordpress.com/2008/09/20/implementing-the-repository-and-finder-patterns/

是否有任何方法可以避免多个功能或者我是否继续为每个过滤器创建单独的功能?

Bor*_*hov 8

您是否考虑在应用程序中实施规范模式?也许它看起来像是一种矫枉过正,但如果你的应用程序有一些复杂的用户过滤选项,它可能会很有用.

class CampaignSpecification
{
    public CampaignSpecification Number(string number);
    public CampaignSpecification DateBetween(DateTime from, date to);
    public CampaignSpecification Year(DateTime year);
} //I have omitted all the AND/OR stuff it can be easily implemented with any SQL like query language
Run Code Online (Sandbox Code Playgroud)

这是一个如何从存储库加载的示例

var  campaignList = CampaignRepository.load(
            new CampaignSpec()
                .Number("2")
                .Year(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

此外,我想补充一点,它在很大程度上取决于您使用的是哪种数据访问解决方案,当您知道将使用哪种API时,它会使实现变得更容易(Criteria API,SQL或其他),以便您可以调整您的规范接口使其实现更简单.

更新:如果您使用linq和nHibernate在.NET中实现规范,请查看http://linqspecs.codeplex.com/