Asp.net mvc 真实世界的ASP.NET MVC存储库

Asp.net mvc 真实世界的ASP.NET MVC存储库,asp.net-mvc,repository-pattern,repository,ddd-repositories,multiple-repositories,Asp.net Mvc,Repository Pattern,Repository,Ddd Repositories,Multiple Repositories,在现实世界中,控制器可能需要使用来自各种数据库表和其他数据存储的数据。例如: [Authorize] public class MembersController : Controller { ICourseRepository repCourse; IUserCourseRepository repUserCourse; IMember member; public MembersController(ICours

在现实世界中,控制器可能需要使用来自各种数据库表和其他数据存储的数据。例如:

[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;
        }
        Guid userId;
        public Guid UserId
        {
            get
            {
                if (userId == null)
                {
                    try
                    {
                        userId = (Guid) Membership.GetUser().ProviderUserKey;
                    }
                    catch { }
                }
                return userId;
            }
        }
因此:

  • 我应该为每个表使用存储库吗

  • 我想这就是agregates的概念发挥作用的地方?每个聚合是否应该有一个存储库

  • 我是否只需要向控制器的构造函数添加所需数量的存储库

  • 这是否表明我的设计是错误的

  • 注: IMember接口本质上代表了一个帮助对象,它为成员资格提供者提供了一个漂亮的面孔。也就是说,它把所有的代码放在一个地方。例如:

    [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;
            }
    
            Guid userId;
            public Guid UserId
            {
                get
                {
                    if (userId == null)
                    {
                        try
                        {
                            userId = (Guid) Membership.GetUser().ProviderUserKey;
                        }
                        catch { }
                    }
                    return userId;
                }
            }
    
    这样做的一个问题肯定是缓存这种输出。我能感觉到另一个问题

    编辑: 我使用Ninject进行DI,我对整个DI、DDD和TDD都非常满意。嗯,有点。我也试着成为一名实用主义者……

    这一切都取决于你的“领域驱动设计”将如何。你知道聚合根是什么吗?大多数情况下,一个能够处理所有基本CRUD的泛型存储库就足够了。只有当您开始使用具有上下文和边界的厚模型时,这才开始起作用

    1.
    我应该为每个表使用存储库吗

    可能不会。如果每个表都有一个存储库,那么实际上就是在做活动记录。我个人也倾向于避免将这些类称为“存储库”,因为域驱动设计的“存储库”概念与每个表的类“存储库”之间可能会出现混淆,这似乎已在Linq2SQL、亚音速等和许多MVC教程中普遍使用

    2.
    我想这就是agregates的概念发挥作用的地方吧?每个聚合是否应该有一个存储库

    是的,是的。如果你要走这条路

    “3.”我是否只需向控制器的构造函数添加所需数量的存储库

    我不让我的控制器直接接触我的存储库。我也不让我的视图直接触及我的域类


    相反,我的控制器具有负责返回视图模型的查询类。查询类引用编译视图模型所需的任何存储库(或其他数据源)。

    Well@awrigley,我的建议如下:

    问:我应该为每个表使用存储库吗

    答:没有,正如你在第二个问题上提到的。对每个聚合使用存储库,并仅对聚合根执行操作

    问:我是否只需要向控制器的构造函数添加所需数量的存储库

    答:我猜您正在使用IoC和构造函数注入,在这种情况下,请确保只传递真正的依赖项。可以帮助你决定这个话题

    (pst!空捕不是件好事!!);)


    干杯

    可能重复的-每个月左右都会弹出一次。@jfar-所以你投票决定关闭某个重复的项目,然后你在这里发布与重复问题(逐字逐句)完全相同的答案?这是怎么回事???@RPM1984-因为复制品很少被关闭,我不想让qstarins答案成为这个问题中的唯一答案。问题是#1。存储库将ORM从您身边抽象出来,并提供比直接针对datacontext/nhib会话更易于测试的接口。这些类不是无意义的,可以包含特定于持久性的逻辑,比如更新“last updated”。@qstarin我有类似的设置,只是我们通过域服务访问存储库。@jfar:“无意义”有点强。但是这些问题并不特别需要一个“存储库”,我发现有必要避免与DDD的“存储库”概念混淆。如果它们是每表数据访问对象,我倾向于称它们为DAO。另外,如果您是按表存储库,那么您实际上并没有使用ORM。从技术上讲,您可能正在使用ORM,但没有使用M部件。@qstarin-Repository与DDD无关。这是一种可以独立生存的模式。你对ORM的部分完全错了。映射和加载嵌套/相关实体仍然是ORM的一个重要部分。我认为你试图描绘一幅糟糕的画面,“除非你使用DDD,否则你是原始的”。@qstarin得到了饼干,因为他的答案指向了正确的方向。它揭示了为什么服务层是一个好主意。空捕获=仍在开发中并且=未来的错误!