Domain driven design 服务、模型和存储库层之间的交互

Domain driven design 服务、模型和存储库层之间的交互,domain-driven-design,Domain Driven Design,我的任务是将一个应用程序从SharePoint翻译成.NET。我关心的是如何以正确的方式完成它,所以我得到了一本关于模式和实践的体系结构书籍 我试着用领域驱动的设计对一切进行建模。我有一个代表我的世界的模型,一个将其存储在数据库中的存储库,以及一个与UI交互的服务层(这是WebForms,因为我在MVC方面没有任何经验,并且已经很难涉足这项工作) 我很难掌握层交互的正确方式。我的理解是,模型应该是一切的基础。它不引用任何内容,其他层引用它。 问题1:是这样吗 我非常关心服务层。我注意到我正在开发

我的任务是将一个应用程序从SharePoint翻译成.NET。我关心的是如何以正确的方式完成它,所以我得到了一本关于模式和实践的体系结构书籍

我试着用领域驱动的设计对一切进行建模。我有一个代表我的世界的模型,一个将其存储在数据库中的存储库,以及一个与UI交互的服务层(这是WebForms,因为我在MVC方面没有任何经验,并且已经很难涉足这项工作)

我很难掌握层交互的正确方式。我的理解是,模型应该是一切的基础。它不引用任何内容,其他层引用它。
问题1:是这样吗

我非常关心服务层。我注意到我正在开发一个非常贫乏的模型,原因有两个:1,我的模型没有引用存储库,所以我不能通过模型存储任何东西。2、我尝试在事情发生时进行操作(即,我将一个对象添加到一个对象列表中,因此我在数据库中一次存储一个对象,而不是在用户添加完对象后一次存储所有对象)。因此,很多工作都是在服务层和代表层之间完成的,模型就在那里,看起来不错


我开始担心了——我处于开发的早期,但我是被视为所有这些的架构师的人。我不希望出现维护噩梦(我希望这个应用程序可以使用多年)。和往常一样,时间是一个问题,我无法有效地准备/学习。任何帮助都将是巨大的。:-)

模型应该是一切的基础。它不引用任何内容,其他层引用它。 问题1:是这样吗

在域模型和持久性系统之间强制分离的典型方法是定义存储库。然而,持久性不是域模型的一部分

您的模型应调用存储库定义的方法

例如,考虑这个完全的假存储库:

// Repository
public class SharepointRepository
{
   void SaveWidget(); // Implement
}
所以存储库只关心加载和保存数据,它们根本不包含任何域逻辑

然而,如果您的模型紧密地绑定到存储库,那么您就有了一个关注点分离的问题

因此,在这种情况下,依赖项注入变得非常有用。在前面的示例中,您的模型必须显式实例化SharePointRepository并调用方法。一种更干净的方法是在运行时注入存储库的依赖项,这样模型才不会在意

namespace YourApp.Domain.Abstract
{
    public interface ISharePointRepository
    {
        void SaveWidget();
    }
}
基于此接口,您可以构建一个具体的实现,并在运行时将依赖项注入具体实现

namespace YourApp.Domain.Concrete
{
    public class SqlSharePointRepository : ISharePointRepository
    {
        void SaveWidget()
        {
          // Code that Saves the widget using the managed sql provider
        }

    }
}
因此,在您的web表单上:

当您收集数据时,您的模型将使用表单中的数据进行水合,并将调用存储库方法,但是存储库本身将在运行时被注入asp.net应用程序,因此您可以将SqlSharePointRepository更改为RavendBRespository,而不会中断应用程序

要了解如何在Webforms中绑定存储库,请参阅以下文章:


有了MVC,管制员就要对你认为你正在经历的差距负责。但是对于您的问题,根据您当前的设计,模型应该调用存储库操作,但是存储库本身应该是松散耦合的。

这非常有用。当你说模型没有“引用”存储库时,你是什么意思?现在,我有模型和代表在不同的项目。如果模型调用Rep来持久化,那么模型必须引用存储库,对吗?是的,确实如此,但是如果存储库在运行时被注入,那么它仍然是松散耦合的,所以您仍然有独立的关注点。