我为销售人员设置了一个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要求变得越来越快,我需要首先解决这个问题。答案 0 :(得分:3)
创建一个专门的ReportingRepository
,返回一个特殊形式的SalesPerson,或使用CQRS。
答案 1 :(得分:3)
它们只是查看SalesPerson
相同数据的另一种方式
我认为CQRS的一些概念可以适应您的情况。在你的情况下,我会有类似的东西:
interface SalesReportingService {
Integer countSalesOfPeronsInPreviousDays(SalesPersonId id, Integer days)
}
您需要的值是数字,因此需要此信息的代码组件可以使用此服务来计算它(将该用例与知道如何隔离)为了计算它,它只表达了对查询的依赖性
然后,可以使用SqlSalesReportingService
(或MongoDbSalesReportingService
或YourPersistenceTechSalesReportingService
)这样的直接实现,以更简单的方式完成服务的实现,或者您可以重新使用已创建的存储库。< / p>
答案 2 :(得分:1)
对于这些类型的场景,我也会使用CQRS路由并转到ISalesPersonQuery
,它返回一个原语或一些读取模型(DTO),表示可用的数据格式。
答案 3 :(得分:0)
当你以一种“停止&#34;作为一个模范,你不应该在一个模型中对它进行思考&#34;。
如果您执行GROUP BY
,添加Count(*)
或以其他方式修改记录,则应将其视为&#34;包含列&#34;的行。