Domain driven design 如何在横切项目中读取配置值?

Domain driven design 如何在横切项目中读取配置值?,domain-driven-design,Domain Driven Design,我遵循DDD指导原则来组织我的项目,我有域、基础设施、应用程序和表示层 我还定义了一个叫做Common的跨领域项目。所有其他项目都依赖于公共资源 我在公共项目中需要的一件事是我的配置/设置值。我已在DB表中定义了所有解决方案范围的设置。公共项目读取设置,任何其他项目都可以通过公共项目访问这些设置 公共项目应该如何访问数据库?在解决方案中的任何其他地方,我都使用基础结构层从数据库读取数据,但如果我在公共项目中引用基础结构,我将得到循环依赖 公共项目是否应该有自己的DB读取器?或者将所有配置放在公共

我遵循DDD指导原则来组织我的项目,我有域、基础设施、应用程序和表示层

我还定义了一个叫做Common的跨领域项目。所有其他项目都依赖于公共资源

我在公共项目中需要的一件事是我的配置/设置值。我已在DB表中定义了所有解决方案范围的设置。公共项目读取设置,任何其他项目都可以通过公共项目访问这些设置

公共项目应该如何访问数据库?在解决方案中的任何其他地方,我都使用基础结构层从数据库读取数据,但如果我在公共项目中引用基础结构,我将得到循环依赖


公共项目是否应该有自己的DB读取器?或者将所有配置放在公共项目中一开始就不是正确的设计

依赖性总是一件有趣的事情

因为您还没有指定您正在使用的语言/环境,而且我有C语言的经验,所以我将使用与强类型OO语言相关的技术和术语,比如它

假设我们将分离接口和实现。我将使用以大写字母“I”开头的c表示法来更清楚地说明什么是接口

您的存储库是域的一部分。假设您拥有Account实体,并且您拥有该实体的AccountRepository

我们将要做的是将这个存储库的接口与其实现分开。我们将有IAccountRepository和一个可能不止一个的具体实现,但这对于它来说是非常罕见的:AccountRepository

如果我们想使用SQL数据库,我们可能有SQLAccountRepository。如果我们想使用MongoDB,我们可以使用MongodBrespository。这两个具体的存储库都将实现IAccountRepository接口

IAccountRepository是您的域的一部分,但是SQL、MongoDB等实现是您的基础结构层的一部分,因为在本例中,它们将访问外部事物SQL server或MongoDB server

在这种情况下,您的依赖项将是“基础结构->域”,而不是“域->基础结构”。这将您的域与基础结构隔离,因为基础结构引用了域注释,反之亦然

通过使用接口,域只指定它需要什么,而不指定它需要什么

如果您采用相同的想法,您可以在公共项目中定义接口,以获取和设置必要的设置,如设置Provider、IApplicationSettings等,并允许引用Common的基础结构为这些接口提供实现SQLSettingsProvider等

您可以使用依赖注入、服务定位器或类似技术将实现绑定到接口

公共包可以按功能进行组织。在这里,IConfigProvider实现将与接口位于同一个包中

例如


您还可以考虑全局配置作为支持的BC,并在每个下游上下文中实现适当的反腐败层,其中每个上下文都有自己的视图和对这样的配置的解释。这些应用程序是否与缓存、端点、连接字符串、IoC等相关,或者是否与demain相关?@plalx:谢谢您的回复。这些是解决方案范围内的配置,不敏感,可以存储在纯文本中,因此不会连接字符串。。。这些主要是配置值,可能会根据应用程序运行的国家/地区而变化:例如,租金单位可能是每周或每月,或者国家/地区的名称,例如新西兰、英国等。。。还有一些属性的最小和最大限制,例如用户配置文件的最大长度(以字符为单位)。。。还有一些可以以纯文本形式存储的端点。我本以为存储库是基础设施的一部分。。。但不管怎样,若我引用横切项目中的存储库,我会得到循环依赖关系。为什么你们要引用横切项目中的存储库?如果存储库是您的域的一部分,则只能从应用程序和基础架构层引用它们。该基础设施将为交叉项目和供应商实施提供参考。下面的图表显示了外部层如何引用内部层。谢谢。对不起,我没有听懂,请你解释一下以下问题。。。所以ConfigProvider存在于公共项目中,所以我假设它应该有自己的DbReader来从DB读取配置值?你能解释一下为什么domian.model在公共项目中吗?实体是我们存储配置值的结构吗?@HoomanBahreini domain.model与您的用例无关。我只是想说明common是一个支持库,可以支持许多不同的层。例如,您可以在common.domain.model中有一个基本实体类,其中的实体在al中 l其他BC继承。在我上面的示例中,DbReader将是IConfigProvider的一个实现,是的,它可以像示例中一样存在于common.config包中。