存储库模式和业务逻辑

Dan*_*net 10 repository repository-pattern

我有一个repository(CustomerRepository),它从数据层检索数据.大多数业务逻辑都在Customer存储库接受或返回的实体类()中.

但是,您在哪里放置全局实体业务逻辑(适用于所有客户)?

例如,我可能不希望将所有客户都退回给某些用户.我不想把那个逻辑放在存储库中.

blu*_*blu 21

我同意Robert Munteanu的观点.

基本上,您将模型中不固有的业务逻辑汇总到中间层.中间层是业务层/业务对象/业务逻辑层/等,但仅称为服务层.它不一定是Web服务,它广泛使用术语服务,因为它聚合了特定应用程序区域的功能.

您基本上有一个包含存储库引用的CustomerService类.您的表示层将引用服务层类.

还有一个额外的区别可以从您使用.net的名称猜测,并且可能使用LINQ to SQL作为NerdDinner中概述的存储库.

存储库通常将IQueryable返回到服务层,允许服务层链一起多个查询来构建不同的结果集.然后,服务使用ToList或其他类似方法计算表达式,并将其返回到表示层.

  • 我遇到了类似的问题,这是最好的架构吗?我不再担心与工厂之间的合同接口,只关注使其工作.我经常发现人们过度设计解决方案.是建立代码库这一时刻的目的,是对自己的层次和层次的强大和完美的致敬?我认为,只要您将数据内容保存在存储库中,商业服务中的"业务逻辑"以及视图中的UI内容就可以了.完成软件应该做的事情,随时重构 (12认同)
  • 从存储库返回“ IQueryable <T>”会破坏存储库为您提供的数据访问抽象。“ IQueryable”是一个对象,它使您能够查询数据,但它不为您提供数据。因此,为服务类编写单元测试非常困难,因为您现在必须处理服务中的基础数据库(并非所有Linq提供程序都实现所有扩展方法)。当您的存储库返回物化数据时,您可以在单元测试中将其模拟掉,而不必考虑您的后备存储区是否是SQL数据库,oracle,文件系统等。 (3认同)

C. *_*oss 7

将它放在另一个存储库(BusinessRuleRepository)中并让CustomerRepository使用它.

要么

如果业务逻辑仅限制结果,则用户可以看到您可能希望将Facade模式与工厂一起使用.在这种情况下,您将拥有一个ICustomerRepository来处理您的CustomerRepository和LimitedCustomerRepository(可能封装CustomerRepository),以及一个CustomerRepositoryFactory,它为用户返回相应的ICustomerRepository.


Rob*_*anu 6

将它包裹在服务之后.

  • 在这种情况下,这甚至意味着什么? (4认同)
  • 至少试着给出你的观点的理由怎么样? (2认同)