存储库类中的非CRUD操作

时间:2018-01-04 14:45:34

标签: design-patterns architecture domain-driven-design repository-pattern

我为销售人员设置了一个Repository类,如下所示:

public class SalesPersonRepository : ISalesPersonRepository
{
     public int Add(SalesPerson salesPerson)
     {
          // Add the salesperson to the data store and return the Id
     }

     public void Update(int id, SalesPerson salesPerson)
     {
         // Update the sales person's record in the data store
     }

     public SalesPerson Get (int id)
     {
         // Fetch and return the salesperson's record
     }

    // a couple of other methods like GetAll and Delete
}

正如您所看到的,我使用的是SalesPerson类,其中我代表了销售人员,在我的存储库类中,我使用的是上述标准CRUD操作。

但是,当我遇到这样的要求时:"获取销售人员最后30,60和90天的销售数量","获取客户的数量营业员"我不确定是否应该在SalesPerson对象中返回此数据。

我可以添加诸如SalesPerson.ThirtyDaySaleCount,SalesPerson.SixtyDaySaleCount,SalesPerson.NinetyDaySaleCount之类的定义属性,并在存储库方法中分配它们,但显然,这看起来不是很好的设计。

此外,当我获取销售员的30,60,90天销售额时,我对SalesPerson类中定义的其他内容不感兴趣,如名字,姓氏和其他信息。

那么如何为这些专业场景返回数据?我应该为这些创建专门的类,还是应该继续将所有内容放在SalesPerson类中?

PS:我知道SalesPerson是一个贫血的对象,我应该想到让它变得非贫血,但我的直接关注是非CRUD要求变得越来越快,我需要首先解决这个问题。

4 个答案:

答案 0 :(得分:3)

创建一个专门的ReportingRepository,返回一个特殊形式的SalesPerson,或使用CQRS

答案 1 :(得分:3)

它们只是查看SalesPerson相同数据的另一种方式 我认为CQRS的一些概念可以适应您的情况。在你的情况下,我会有类似的东西:

interface SalesReportingService {
    Integer countSalesOfPeronsInPreviousDays(SalesPersonId id, Integer days)
}

您需要的数字,因此需要此信息的代码组件可以使用此服务来计算它(将该用例与知道如何隔离)为了计算它,它只表达了对查询的依赖性 然后,可以使用SqlSalesReportingService(或MongoDbSalesReportingServiceYourPersistenceTechSalesReportingService)这样的直接实现,以更简单的方式完成服务的实现,或者您可以重新使用已创建的存储库。< / p>

答案 2 :(得分:1)

对于这些类型的场景,我也会使用CQRS路由并转到ISalesPersonQuery,它返回一个原语或一些读取模型(DTO),表示可用的数据格式。

答案 3 :(得分:0)

当你以一种“停止&#34;作为一个模范,你不应该在一个模型中对它进行思考&#34;。

如果您执行GROUP BY,添加Count(*)或以其他方式修改记录,则应将其视为&#34;包含列&#34;的行。