在现实世界中,控制器可能需要使用来自各种数据库表和其他数据存储的数据。例如:
[Authorize]
public class MembersController : Controller
{
ICourseRepository repCourse;
IUserCourseRepository repUserCourse;
IMember member;
public MembersController(ICourseRepository repCourse, IUserCourseRepository repUserCourse, IMember member)
{
this.repCourse = repCourse;
this.repUserCourse = repUserCourse;
this.member = member;
}
所以:
我应该为每个表使用存储库吗?
我想这是agregates的概念发挥作用的地方?我应该每个汇总有一个存储库吗?
我是否只需要向Controller的构造函数添加所需数量的存储库?
这是否表明我的设计有误?
IMember接口实际上代表了一个帮助对象,它在成员资格提供程序上放置了一个很好的面孔。即,它将所有代码放在一个地方。例如:
Guid userId;
public Guid UserId
{
get
{
if (userId == null)
{
try
{
userId = (Guid) Membership.GetUser().ProviderUserKey;
}
catch { }
}
return userId;
}
}
这方面的一个问题肯定是缓存这种输出。我可以感受到另一个问题。
我正在使用Ninject进行DI,并且在整个DI,DDD和TDD上都很畅销。好吧,有点。我也试图成为一个实用主义者......
答案 0 :(得分:6)
1.
我应该为每个表使用存储库吗?
可能不是。如果每个表都有一个存储库,那么您基本上就是在进行Active Record。我个人也更愿意避免将这些类称为“存储库”,因为域驱动设计的“存储库”概念与类似于每个表的“存储库”之间可能出现的混淆似乎已经成为Linq2SQL,SubSonic的常用例子等等和许多MVC教程。
2.
我想这是agregates的概念发挥作用的地方?我应该每个聚合有一个存储库吗?
是的,是的。如果你打算走这条路。
'3'。我是否只需要向Controller的构造函数添加所需数量的存储库?
我不让我的控制器直接触摸我的存储库。而且我也不让我的视图直接触及我的域类。
相反,我的控制器具有负责返回View Models的Query类。 Query类引用编译View Model所需的任何存储库(或其他数据源)。
答案 1 :(得分:2)
那么@awrigley,这是我的建议:
问:我应该为每个表使用存储库吗?
答:不,正如您在问题2中提到的那样。每个聚合使用一个存储库,并仅对聚合根执行操作。
问:我是否只需要向Controller的构造函数添加所需数量的存储库?
答:我猜你正在使用IoC和构造函数注入,在这种情况下,请确保只传递真正的依赖项。 this post可以帮助您确定此主题。
(pst!空的捕获不是一件好事!);)
干杯!
答案 2 :(得分:-1)
这完全取决于你将如何“领域驱动设计”。你知道聚合根是什么吗?大多数情况下,可以执行所有基本CRUD的通用类型存储库就足够了。只有当你开始拥有带有上下文和边界的厚模型时才开始变得重要。