服务,模型和存储库层之间的交互

时间:2011-11-03 13:53:45

标签: domain-driven-design

我的任务是将应用程序从SharePoint转换为.NET。我关心的是以正确的方式做到这一点,所以我得到了一本架构书来阅读模式和实践。

我尝试使用Domain Driven Design对所有内容进行建模。我有一个代表我的世界的模型,一个将它存储在数据库中的存储库,以及一个与UI交互的服务层(这是WebForms,因为我在MVC中有0个经验,而且我已经很难用这项工作踩水了。) / p>

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

我真的很关心服务层。我注意到我正在开发一个非常贫血的模型,原因有两个:1,我的模型没有引用存储库,所以我不能通过模型​​存储任何东西。 2,我正在尝试做事情(即我将对象添加到对象列表中,因此我将其一次存储在DB中,而不是在用户完成添加对象时立即存储)。因此,Service和Rep层之间正在进行大量工作,模型就在那里并且看起来不错。

我开始担心 - 我在开发的早期阶段,但是我被认为是所有这些的架构师。我不想要维护噩梦(我希望这个应用程序可以使用多年)。一如既往,时间是一个问题,我无法有效地准备/学习。任何帮助都会膨胀。 : - )

1 个答案:

答案 0 :(得分: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
        }

    }
}

所以在您的网络表单上:

当您收集数据时,您的模型将使用表单中的数据进行补充,并将调用存储库方法,但是存储库本身将在运行时注入到asp.net应用程序中,因此您可以将SqlSharePointRepository更改为RavenDbRepository没有破坏你的应用程序。

要了解如何在Webforms中绑定您的存储库,请参阅此SO帖子:How can I implement Ninject or DI on asp.net Web Forms?

使用MVC,控制器负责您认为正在经历的差距。但是对于您的问题并且基于您当前的设计,模型应该调用存储库操作,但是存储库本身应该松散耦合。