2011-11-03 86 views
2

我的任务是将应用程序从SharePoint转换为.NET。我很关心正确的做法,所以我找了一本体系结构书来阅读模式和实践。服务,模型和存储库层之间的交互

我试图使用域驱动设计对所有东西进行建模。我有一个代表我的世界的模型,一个将它存储在数据库中的Repository,以及一个与UI交互的服务层(这是WebForms,因为我在MVC中没有0经验,并且已经很难用这个工作来跋涉)。

我很难理解图层互动的正确方法。我的理解是,模型应该是一切的基础。它什么都没有引用,其他图层引用它。
问题1:对吗?

我真的很关心服务层。我注意到我正在开发一个非常贫血的模型,原因有两个:1,我的模型没有引用Repository,所以我不能通过模型​​存储任何东西。 2,我试图在事情发生的时候做事(例如,我将一个对象添加到一个对象列表中,所以当用户完成添加对象时,我一次一个地将它存储在数据库中,而不是一次)。所以很多工作都在Service和Rep层之间完成,Model只是在那里,看起来不错。

我开始担心 - 我在开发的早期阶段,但我被看作是所有这些设计师。我不想要维护噩梦(我预计这个应用将会使用多年)。与往常一样,时间是一个问题,我无法有效地进行准备/学习。任何帮助将会膨胀。 :-)

回答

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。

要了解如何将仓库绑定在Web表单看到这个帖子SO:How can I implement Ninject or DI on asp.net Web Forms?

在MVC中的控制器负责你认为你所遇到的差距。但对于您的问题和根据您当前的设计,模型应该调用存储库操作,但是存储库本身应该是松散耦合的。

+0

这非常有帮助。当你说模型没有“引用”仓库时,你是什么意思?现在我有模型和代表在单独的项目。如果模型调用Rep来坚持,Model需要引用Repository,对吗? –

+0

是的,但它仍然会松散耦合,如果在运行时注入存储库,所以您仍然有问题的分离。 – kd7