如果我的对象/模型包含域功能,它应该在哪里生存?

时间:2014-01-28 13:55:21

标签: oop design-patterns architecture repository domain-driven-design

我使用CRC卡设计了我的类,我有一组可爱的对象,包含域/业务逻辑和数据(属性)。有些类需要保存到数据库并从中读取数据。

我的存储库应该存在于我的域对象的单独项目中,但需要引用它们才能创建它们。

但是,域对象/实体需要能够引用存储库。

我可以将对象放在存储库中,但由于它们包含域功能,所以根本感觉不对。

我可以将需要持久性的对象放在一个共同的共享项目中,但再次将它们单独输出会感觉不对。

我应该把它们放在哪里?我不能帮助我觉得我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:4)

域对象/实体不应使用存储库。其域/应用程序服务应使用存储库。这样做非常简单 - 您应该在域模型程序集中定义存储库接口,并在域/应用程序服务中使用它们。

域库应包含

  • 域名模型
  • 存储库接口
  • 域服务(仅使用存储库的接口)

此库不引用其他库 - 它位于系统的核心。

持久性库应包含特定于数据提供者的存储库的实现。例如。它可以使用实体框架。该库应该引用您的域库。因此,它将了解它应该实现的接口以及它应该使用的实体。

答案 1 :(得分:0)

  

但是,域对象/实体需要能够引用存储库。

他们呢?或者他们是否需要引用存储库的接口?然后,存储库本身只是该接口的一个实现,是域逻辑代码不需要的低级细节。

我通常在项目中构建存储库模式的方式是:

  • 域核心项目(业务模型,核心业务逻辑,依赖接口)
  • 依赖项目(引用域核心项目,实现接口)
  • 应用程序项目(引用域核心项目,直接引用依赖项目,或通过配置或通过处理依赖项注入的中间项目引用依赖项目)

作为一个例子,假设我使用服务定位器进行依赖注入(我经常这样做)。然后,业务模型只需要引用Service Locator对象(它本身由工厂提供并可以注入)。因此,商业模式的内部可能有这样的东西:

public class SomeBusinessModel
{
    private ISomeDependency SomeProperty
    {
        get
        {
            return DIFactory.Current.Resolve<ISomeDependency>();
        }
    }
}

DIFactory有一个名为Current的静态属性,它基本上是一个返回依赖注入解析器的工厂方法,它的接口有一个名为Resolve的方法,它接受一个类型并返回一个实例

所以在这种情况下......

  • SomeBusinessModel位于域核心项目中
  • ISomeDependency位于域核心项目中
  • IDIContainerCurrent的返回类型)位于域核心项目
  • DIFactory位于域核心项目中,并由Application Project为特定的依赖注入容器初始化(它具有设置当前注入容器的Initialize方法)
  • SomeDependency(解析程序返回的实际实例类型)在依赖项目中

在此设置中,业务模型知道需要存储库,并且需要提供存储库,但它们不具有硬依赖性。应用程序为这些存储库提供实际实现,可以直接通过提供实例,也可以通过配置依赖注入容器间接提供实例。

所有实际依赖项都将向内从实现细节(应用程序和依赖项)指向核心业务逻辑。永远不要向外。