1

这是示例代码:

public interface IService<TEntity> {        
        IContext Context { get; set; }
        //unimportant methods
        bool Validate(TEntity entity);
        void Add(TEntity enttity);
    }

 public class UsersController : Controller {
        private IService<User> _service;
        public MyController(IService<User> service){
            _service = service;
            _service.Context = ControllerContext;
        }
    }

我正在使用 AutofacControllerFactory 在我的 ASP.NET MVC 应用程序中创建控制器。是否可以在每个控制器的构造函数中消除这行代码:

_service.Context = ControllerContext;

换句话说:是否可以使用 ControllerContext 自动设置此属性?这应该是可能的,因为每个 IService 实现都有一个可设置的 IContext 属性。

我应该扩展 AutofacControllerFactory 还是有标准的方法?

4

1 回答 1

2

你所拥有的是Circular Dependency

  • UsersController取决于IService<User>
  • IService<User>取决于ControllerContext
  • ControllerContext取决于UsersController

没有 DI 容器可以进入你的类的内部并控制那里发生的事情。他们可以为您设置依赖项并将它们从外部注入到您的类中。但是,它们不能很好地处理循环依赖,因此更好的选择是重新设计 API。

IService<TEntity>从这里看,它的Context 属性看起来很像Leaky Abstraction。一个 Service 不需要知道关于它运行的 UI 框架的任何信息。

您通常可以通过将其中一个消费者更改为更受事件驱动的架构来打破循环依赖关系。

是一篇关于这类问题的文章

这是一个看起来很像您的 ASP.NET MVC 问题的相关答案:在 ASP.NET MVC ContactsManager 教程中是否有解决依赖注入循环问题的好/正确方法?

另见答案:依赖注入解决循环依赖

于 2010-07-19T14:54:47.603 回答