标签: repository-pattern

什么是聚合根?

我试图了解如何正确使用存储库模式.Aggregate Root的核心概念不断涌现.在搜索Web和Stack Overflow以获取有关聚合根的帮助时,我会不断发现有关它们的讨论以及指向应该包含基本定义的页面的死链接.

在存储库模式的上下文中,什么是聚合根?

design-patterns ddd-repositories aggregateroot repository-pattern

417
推荐指数
8
解决办法
10万
查看次数

DAO和Repository模式有什么区别?

数据访问对象(DAO)和存储库模式之间有什么区别?我正在开发一个使用Enterprise Java Beans(EJB3),Hibernate ORM作为基础架构,域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术的应用程序.

domain-driven-design hibernate data-access-layer repository-pattern ejb-3.0

397
推荐指数
9
解决办法
14万
查看次数

PHP中的正确存储库模式设计?

前言:我正在尝试在具有关系数据库的MVC架构中使用存储库模式.

我最近开始用PHP学习TDD,并且我意识到我的数据库与我的应用程序的其余部分非常接近.我已经阅读了有关存储库和使用IoC容器将其"注入"我的控制器的内容.很酷的东西.但是现在有一些关于存储库设计的实际问题.考虑以下示例.

<?php

class DbUserRepository implements UserRepositoryInterface
{
    protected $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function findAll()
    {
    }

    public function findById($id)
    {
    }

    public function findByName($name)
    {
    }

    public function create($user)
    {
    }

    public function remove($user)
    {
    }

    public function update($user)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

问题#1:字段太多

所有这些find方法都使用select all fields(SELECT *)方法.但是,在我的应用程序中,我总是试图限制我获得的字段数量,因为这通常会增加开销并减慢速度.对于那些使用这种模式的人,你如何处理这个?

问题#2:方法太多了

虽然这个类现在看起来不错,但我知道在现实世界的应用程序中我需要更多的方法.例如:

  • findAllByNameAndStatus
  • findAllInCountry
  • findAllWithEmailAddressSet
  • findAllByAgeAndGender
  • findAllByAgeAndGenderOrderByAge
  • 等等.

如您所见,可能存在非常长的可能方法列表.然后,如果您添加上面的字段选择问题,问题就会恶化.在过去,我通常只是将所有这些逻辑放在我的控制器中:

<?php

class MyController
{
    public function users()
    {
        $users = User::select('name, email, status') …
Run Code Online (Sandbox Code Playgroud)

php database repository repository-pattern laravel

265
推荐指数
4
解决办法
6万
查看次数

存储库和服务层之间的区别?

在OOP设计模式中,存储库模式和服务层之间有什么区别?

我正在开发一个ASP.NET MVC 3应用程序,我正在尝试理解这些设计模式,但我的大脑却没有得到它......

oop asp.net-mvc repository-pattern service-layer

181
推荐指数
5
解决办法
8万
查看次数

DDD - 实体无法直接访问存储库的规则

在领域驱动设计,似乎有很多协议,任何单位不得直接访问存储库.

这是来自Eric Evans Domain Driven Design的书,还是来自其他地方?

对于它背后的推理,哪里有一些很好的解释?

编辑:澄清:我不是在谈论将数据访问分离到业务逻辑的单独层的经典OO实践 - 我在谈论DDD中的特定安排,实体不应该与数据对话访问层(即它们不应该包含对Repository对象的引用)

更新:我给了BacceSR赏金,因为他的回答似乎最接近,但我仍然对这个问题一无所知.如果它有这么重要的原则,肯定会在网上有一些关于它的好文章吗?

更新:2013年3月,关于这个问题的投票意味着人们对此很感兴趣,即使有很多答案,我仍然认为如果人们有这方面的想法,还有更多的空间.

oop domain-driven-design s#arp-architecture repository-pattern

166
推荐指数
6
解决办法
3万
查看次数

通用存储库使用EF 4.1有什么意义

随着我深入研究DbContext,DbSet和相关接口,我想知道为什么你需要围绕这些实现实现一个单独的"通用"存储库?

它看起来像DbContext和IDbSet做你需要的一切,并在DbContext中包含"工作单元".

我在这里遗漏了什么,或者似乎人们喜欢无缘无故地添加另一层依赖.

unit-of-work repository-pattern entity-framework-4.1

145
推荐指数
3
解决办法
3万
查看次数

管理Laravel中的关系,遵守存储库模式

在阅读了T. Otwell关于Laravel优秀设计模式的书之后,在Laravel 4中创建应用程序时,我发现自己为应用程序中的每个表创建了存储库.

我最终得到了以下表格结构:

  • 学生:身份证,姓名
  • 课程:id,name,teacher_id
  • 老师:id,姓名
  • 作业:id,name,course_id
  • 分数(充当学生和作业之间的枢轴):student_id,assignment_id,分数

我有所有这些表的查找,创建,更新和删除方法的存储库类.每个存储库都有一个与数据库交互的Eloquent模型.根据Laravel的文档,模型中定义了关系:http://laravel.com/docs/eloquent#relationships .

在创建新课程时,我所做的就是在课程资源库中调用create方法.该课程有作业,因此在创建作业时,我还想在课程中为每个学生在乐谱表中创建一个条目.我是通过Assignment Repository完成的.这意味着赋值存储库使用Assignment和Student模型与两个Eloquent模型进行通信.

我的问题是:由于此应用程序的大小可能会增加并且会引入更多关系,因此在存储库中与不同的Eloquent模型进行通信是一种好的做法,还是应该使用其他存储库来完成(我的意思是从Assignment存储库调用其他存储库) )还是应该在Eloquent模型中一起完成?

此外,将分数表用作作业与学生之间的转轴还是应该在其他地方完成,这是一种好习惯吗?

oop repository-pattern laravel eloquent laravel-4

114
推荐指数
4
解决办法
3万
查看次数

工厂,提供商和服务之间的区别?

工厂,提供商和服务这两个术语有什么区别?

刚进入NHibernate及其Repository模式(POCO类等).

oop design-patterns repository-pattern

101
推荐指数
1
解决办法
4万
查看次数

Spring Data存储库是如何实际实现的?

我已经在我的项目中使用Spring Data JPA存储库一段时间了,我知道以下几点:

  • 在存储库接口中,我们可以添加类似的方法findByCustomerNameAndPhone()(假设customerNamephone是域对象中的字段).
  • 然后,Spring通过在运行时(在应用程序运行期间)实现上述存储库接口方法来提供实现.

我感兴趣的是如何对它进行编码,我已经查看了Spring JPA源代码和API,但我找不到以下问题的答案:

  1. 如何在运行时和方法中生成并注入存储库实现类?
  2. Spring Data JPA是否使用CGlib或任何字节码操作库来实现方法并动态注入?

您能否帮助解决上述问题并提供任何支持的文档?

java spring ddd-repositories repository-pattern spring-data

93
推荐指数
1
解决办法
2万
查看次数

不使用存储库模式,按原样使用ORM(EF)

我总是使用Repository模式但是对于我的最新项目,我想看看我是否可以完善它的使用和我的"工作单元"的实现.我开始挖的越多,我开始问自己一个问题:"我真的需要它吗?"

现在这一切都从Stackoverflow上的一些评论开始,跟踪Ayende Rahien在他的博客上的帖子,其中有2个具体,

这可能是永远和永远讨论的,它取决于不同的应用程序.我想知道什么

  1. 这种方法是否适合实体框架项目?
  2. 使用这种方法是业务逻辑仍然在服务层或扩展方法(如下所述,我知道,扩展方法是使用NHib会话)?

使用扩展方法很容易做到这一点.干净,简单,可重复使用.

public static IEnumerable GetAll(
    this ISession instance, Expression<Func<T, bool>> where) where T : class
{
    return instance.QueryOver().Where(where).List();
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法和NinjectDI,我是否需要创建Context一个接口并将其注入我的控制器?

architecture aop design-patterns entity-framework repository-pattern

89
推荐指数
5
解决办法
2万
查看次数