【问题标题】:Where should my objects/models live if they contain domain functionality?如果我的对象/模型包含域功能,它们应该放在哪里?
【发布时间】:2014-01-28 22:16:11
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 为什么您的对象/实体需要引用存储库?
  • 你们几乎都说了同样的话。没想到将存储库接口放到域项目中。

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


【解决方案1】:

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

域库应该包含

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

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

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

【讨论】:

  • 这似乎是最清楚的答案,谢谢,我纠结了
【解决方案2】:

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

有吗?还是他们需要引用存储库的接口?那么存储库本身只是该接口的一个实现,是域逻辑代码不需要的低级细节。

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

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

例如,假设我使用服务定位器进行依赖注入(我经常这样做)。那么业务模型只需要引用Service Locator对象(它本身是由工厂提供的,可以被注入)。所以在商业模式内部,我可能有这样的东西:

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

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

所以在这种情况下...

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

在此设置中,业务模型知道需要有一个存储库,并要求提供一个存储库,但它们对它们没有硬性依赖。应用程序为这些存储库提供实际实现,直接通过提供实例或间接通过配置依赖注入容器来提供实例。

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

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多