继承代码库中的循环依赖
Circular Dependency in an inherited code base
我还在学习如何构建更大的代码库(一年前我在学习时只处理过 3/4 小项目的解决方案),我一直在尝试组织一个继承的代码库摆脱循环依赖问题。
基本上我有一个由 SQL 数据库支持的 MVC 门户项目,该项目是代码优先使用 Entity Framework。我还有一个存储库项目,用于处理与某些 Azure table 的通信。这些 table 中的数据有些重叠,但 Azure table 不包含来自 Portal 数据库的大部分信息。
问题出现在我创建某些实体时,解决方案要求它们在门户数据库中创建(以便用户可以看到他们的信息)以及这些 Azure tables解决方案的其余部分用于其他目的。
所以 Portal 将数据保存到两者,这意味着我需要在我的 MVC 项目中使用 Repository 项目,但我还需要我的 Repository 项目能够访问 MVC 项目以获取一些未保存到的外围信息Azure tables.
这显然是一个糟糕的设计,但在结构上是否有一种解决方法不需要对 Azure table 结构进行重大重构或更改以包含 Portal 数据库的每个小细节?
我想出的每个 "simple fix" 都不是解决办法,只会让圆圈变大哈哈。设计中的这两个table让我继承了这个就很迷惑
编辑更清晰
我的存储库引用了 MVC 项目,以便使用 ApplicationDbContext 与 Portal 数据库进行通信。据我所知,这不容易分成另一个项目。
我的 MVC 项目引用存储库以将信息存储在 Azure tables 中。这需要保持原样。
我猜这个问题是存储库做的太多了。我开始认为我应该把它们分开,尽管它需要大量返工。
JK
将MVC项目中的"peripheral information"提取到另一个MVC和Repository项目都可以引用的新项目中,并从Repository项目中删除对MVC项目的引用。
编辑:澄清:目前你有这个圈子:
MVC -> Repository -> MVC
您声明 Repository 需要在 MVC 中提取一些 "peripheral information"。因此,将 "peripheral information" 放到另一个项目中,我们称它为 PI,并从 Repository 中删除对 MVC 的引用(因为 Repository 需要的所有外部内容现在都在 PI 而不是 MVC 中)。 这打破了圈子。这会给你:
MVC -> Repository
MVC -> PI
Repository -> PI
这是打破圈子的经典方式,通过创建链接 "entity"。
如果我错了请纠正我,但根据我的理解,您目前想要在 Azure 存储和 SQL 存储之间交换信息。如果是这种情况,那么您应该创建一个 BaseRepository
,它由 SQL 和 Azure 存储继承。然后可以在 BaseRepository
的属性中找到 "peripheral information",可以通过它的 children 访问这些属性。
我还在学习如何构建更大的代码库(一年前我在学习时只处理过 3/4 小项目的解决方案),我一直在尝试组织一个继承的代码库摆脱循环依赖问题。
基本上我有一个由 SQL 数据库支持的 MVC 门户项目,该项目是代码优先使用 Entity Framework。我还有一个存储库项目,用于处理与某些 Azure table 的通信。这些 table 中的数据有些重叠,但 Azure table 不包含来自 Portal 数据库的大部分信息。
问题出现在我创建某些实体时,解决方案要求它们在门户数据库中创建(以便用户可以看到他们的信息)以及这些 Azure tables解决方案的其余部分用于其他目的。
所以 Portal 将数据保存到两者,这意味着我需要在我的 MVC 项目中使用 Repository 项目,但我还需要我的 Repository 项目能够访问 MVC 项目以获取一些未保存到的外围信息Azure tables.
这显然是一个糟糕的设计,但在结构上是否有一种解决方法不需要对 Azure table 结构进行重大重构或更改以包含 Portal 数据库的每个小细节?
我想出的每个 "simple fix" 都不是解决办法,只会让圆圈变大哈哈。设计中的这两个table让我继承了这个就很迷惑
编辑更清晰
我的存储库引用了 MVC 项目,以便使用 ApplicationDbContext 与 Portal 数据库进行通信。据我所知,这不容易分成另一个项目。 我的 MVC 项目引用存储库以将信息存储在 Azure tables 中。这需要保持原样。
我猜这个问题是存储库做的太多了。我开始认为我应该把它们分开,尽管它需要大量返工。
JK
将MVC项目中的"peripheral information"提取到另一个MVC和Repository项目都可以引用的新项目中,并从Repository项目中删除对MVC项目的引用。
编辑:澄清:目前你有这个圈子:
MVC -> Repository -> MVC
您声明 Repository 需要在 MVC 中提取一些 "peripheral information"。因此,将 "peripheral information" 放到另一个项目中,我们称它为 PI,并从 Repository 中删除对 MVC 的引用(因为 Repository 需要的所有外部内容现在都在 PI 而不是 MVC 中)。 这打破了圈子。这会给你:
MVC -> Repository
MVC -> PI
Repository -> PI
这是打破圈子的经典方式,通过创建链接 "entity"。
如果我错了请纠正我,但根据我的理解,您目前想要在 Azure 存储和 SQL 存储之间交换信息。如果是这种情况,那么您应该创建一个 BaseRepository
,它由 SQL 和 Azure 存储继承。然后可以在 BaseRepository
的属性中找到 "peripheral information",可以通过它的 children 访问这些属性。