【问题标题】:How to remove circular reference resulting from dependency injection in my MVC Application?如何在我的 MVC 应用程序中删除依赖注入导致的循环引用?
【发布时间】:2014-09-04 14:57:27
【问题描述】:

我的解决方案包含 3 个项目 -

Project A - 这是启动项目

Project B - 在Project A 中注入的容器接口、提供程序、帮助程序和实现

Project C - 负责使用 Autofac 解析 IoC。

Project A 包含对Project B 的引用,因为它需要其中的接口。 Project C 包含对 Project A 的引用。

我现在正在尝试实现一个需要使用Project A 中定义的模型的新接口。如果我在Project B 中创建接口,这将导致循环引用,因为Project A 已经引用Project B,所以Project B 不能引用Project A 来使用该模型。

如果我在Project A 中创建接口,那么我无法在没有从Project C 引用Project A 的情况下注册它,因为又是循环的。

我在哪里创建和实现这个接口而不引起循环引用。该接口是一种身份验证管理器提供程序。我可以在我的控制器中创建一个函数来做这些事情,但这很不整洁。

【问题讨论】:

  • 为什么B 需要引用A?我假设B 是您的应用程序代码,并且由于A 是您的主要代码,B 不应依赖于A。在不知道为什么B 需要知道A 的模型的情况下,我唯一的建议是不要这样做。
  • 如果我尝试在B 中创建接口,B 将需要对A 的引用,因为该接口使用A 中定义的模型
  • 这些是你说的视图模型?
  • 是的,这些是视图模型。
  • 那我的建议还是一样,给B自己的model,和A分开,然后在A的项目里面翻译成A的model如果你需要。可能两个模型的格式会不同,最好不要将MVC模型的概念耦合到B的项目中。

标签: c# asp.net asp.net-mvc dependency-injection inversion-of-control


【解决方案1】:

您可以将模型从项目 A 移动到项目 B,并且根据您的描述,它看起来无论如何都是一个公共层。

那么你的新界面可以在项目 B 中创建,它不必访问项目 A 来访问这些模型。

【讨论】:

  • 但是 MVC 应用程序的模型不是总是在主/启动项目中吗?
  • 模型可以放在任何地方。按照约定,MVC 在主项目中查找视图/控制器(即使可以更改)。但是在您的情况下,移出模型是有意义的,因为它们是常见的工件。您还可以在项目 B 中创建核心/域模型并将其映射到项目 A 中的视图模型。这样做时,您需要编写从域 -> 视图模型映射的映射器,或者您可以使用 AutoMapper 之类的东西来做基于约定的映射。
  • 现在我已将模型移至B,它似乎可以工作。不确定这是否是最佳做法。可能会研究 Automapper 和核心模型项目。 (在我将您的答案标记为解决方案之前,我会等待一段时间。)
  • 我在公共层使用域/核心模型,在我的 MVC 项目中使用 ViewModel。这是首选方式,但它也增加了复杂性(需要维护的两件事,映射器等)。随着您项目的增长以及这些模型开始更多地偏离您的通用结构,请考虑投资于额外的努力(创建视图模型和映射器)。
【解决方案2】:

您的架构中似乎有一个流程。

您是否能够在另一个项目中提取接口(将在所有项目中引用,但不会引用其他项目)并且其中没有其他内容(因此我们不会试图引用其他内容)?

在进行注入时,我总是将接口项目与实现项目分开......以多种方式将它们混合在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2023-03-30
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多