如何在Cross Cutting项目中读取Config值?

时间:2019-04-11 00:28:18

标签: domain-driven-design

我已遵循DDD指南来构建项目,我拥有 Domain Infrastructure Application Presentation 层。

我还定义了一个名为 Common 的跨领域项目。所有其他项目都依赖于 Common

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

Common 项目应如何访问数据库?在解决方案中的其他任何地方,我都使用 Infrastructure 层从数据库中读取数据,但是如果我在 Common 项目中引用 Infrastructure ,则会得到循环依赖

Common 项目应该具有自己的数据库读取器吗?还是将所有配置放在 Common 项目中最初都不是正确的设计?

2 个答案:

答案 0 :(得分:1)

common软件包可以按功能进行组织。这里的IConfigProvider实现将与接口位于同一个程序包中。

例如

common library

您还可以将全局配置视为支持BC,并在每个下游上下文中实现适当的反腐败层,其中每个上下文对这种配置都有自己的看法和解释。

答案 1 :(得分:0)

依赖性始终是一件有趣的事情。

由于您尚未指定要使用的语言/环境,并且我具有C#的经验,因此我将使用与强类型OO语言相关的技术和术语。

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

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

我们要做的是将此存储库的接口与其实现分开。我们将拥有IAccountRepository和一个具体的实现(也许不止一个,但这很少见):AccountRepository。

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

IAccountRepository是您的 Domain 的一部分,但是实现(SQL,MongoDB等)是您的 Infrastructure 层的一部分,因为它们将访问外部事物(SQL Server或此示例中的MongoDB服务器)。

在这种情况下,您的依赖关系将是' Infrastructure -> Domain '而不是' Domain -> Infrastructure '。这样会将您的域与 Infrastructure 隔离开来,因为 Infrastructure 引用了 Domain 注释,反之亦然。

通过使用接口,您的仅指定 需要 ,而不指定 需求 < / strong>。

如果您采用相同的想法,则可以在 Common 项目中定义接口以获取(必要时进行设置)设置(ISettingsProvider,IApplicationSettings等)并允许 Infrastructure 引用 Common 为这些接口(SQLSettingsProvider等)提供实现

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