Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如果我的对象/模型包含域功能,它们应该位于何处?_Oop_Design Patterns_Architecture_Repository_Domain Driven Design - Fatal编程技术网

Oop 如果我的对象/模型包含域功能,它们应该位于何处?

Oop 如果我的对象/模型包含域功能,它们应该位于何处?,oop,design-patterns,architecture,repository,domain-driven-design,Oop,Design Patterns,Architecture,Repository,Domain Driven Design,我使用CRC卡设计了我的类,我有一组可爱的对象,其中包含域/业务逻辑和数据(属性)。有些类需要保存到数据库或从数据库中读取 我的存储库应该存在于我的域对象的单独项目中,但需要引用它们才能创建它们 但是,域对象/实体需要能够引用存储库 我可以将这些对象放在存储库中,但由于它们包含域功能,这一点都不合适 我可以将需要持久性的对象放在一个公共共享项目中,但再次指出,将它们单独列出是不对的 我应该把它们放在哪里?我禁不住觉得我遗漏了一些明显的东西。域对象/实体不应该使用存储库。其域/应用程序服务应使用存

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

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

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

我可以将这些对象放在存储库中,但由于它们包含域功能,这一点都不合适

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


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

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

域库应包含

  • 域模型
  • 存储库接口
  • 域服务(仅使用存储库的接口)
此库不引用其他库-它位于系统的核心


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

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

域库应包含

  • 域模型
  • 存储库接口
  • 域服务(仅使用存储库的接口)
此库不引用其他库-它位于系统的核心

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

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

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

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

  • 域核心项目(业务模型、核心业务逻辑、依赖接口)
  • 依赖项项目(引用域核心项目,实现接口)
  • 应用程序项目(引用域核心项目,直接引用依赖项项目,或通过配置,或通过处理依赖项注入的中间项目)
例如,假设我正在使用服务定位器进行依赖项注入(我经常这样做)。然后,业务模型只需要引用服务定位器对象(它本身由工厂提供,可以注入)。因此,在商业模式的内部,我可能会有如下内容:

public class SomeBusinessModel
{
    private ISomeDependency SomeProperty
    {
        get
        {
            return DIFactory.Current.Resolve<ISomeDependency>();
        }
    }
}
公共类业务模型
{
私有等轴测属性
{
收到
{
返回DIFactory.Current.Resolve();
}
}
}
DIFactory
有一个名为
Current
的静态属性,它基本上是一个返回依赖项注入解析器的工厂方法,它的接口有一个名为
Resolve
的方法,它接受一个类型并返回一个实例

所以在这种情况下

  • SomeBusinessModel
    位于域核心项目中
  • ISomeDependency
    位于域核心项目中
  • IDIContainer
    (当前
    Current
    的返回类型)位于域核心项目中
  • DIFactory
    位于域核心项目中,并由应用程序项目为特定依赖项注入容器初始化(它有一个设置当前注入容器的
    Initialize
    方法)
  • SomeDependency
    (解析程序返回的实际实例类型)位于依赖项项目中
在这个设置中,业务模型知道需要有一个存储库,并要求提供一个存储库,但它们并不依赖于存储库。应用程序为这些存储库提供实际实现,可以直接提供实例,也可以通过配置依赖项注入容器来间接提供实例

所有实际的依赖关系都从实现细节(应用程序和依赖关系)指向核心业务逻辑。从不向外

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

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

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

  • 域核心项目(业务模型、核心业务逻辑、依赖接口)
  • 依赖项项目(引用域核心项目,实现接口)
  • 应用程序项目(引用域核心项目,直接引用依赖项项目,或通过配置,或通过处理依赖项注入的中间项目)
例如,假设我正在为depende使用服务定位器