Автоматически свойство набора после создания компонента с Autofac

Вот пример кода:

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 для создания контроллеров в моем приложении MVC ASP.NET. Это возможный устранить эту строку кода в конструкторе каждого контроллера:

_service.Context = ControllerContext;

Другими словами: действительно ли возможно автоматически установить это свойство с ControllerContext? Это должно быть возможно, потому что каждая реализация IService имеет устанавливаемое свойство IContext.

Я должен расширить AutofacControllerFactory или являюсь там стандартным способом doint это?

1
задан Valentin 19 July 2010 в 13:12
поделиться

1 ответ

У вас есть Циклическая зависимость .

  • UsersController зависит от IService
  • IService зависит от ControllerContext
  • ControllerContext зависит от UsersController

Нет DI Контейнер может проникнуть внутрь ваших классов и контролировать то, что там происходит. Они могут устанавливать для вас зависимости и внедрять их в ваши классы извне. Однако они не могут хорошо справиться с циклическими зависимостями, поэтому лучший вариант - изменить дизайн API.

Отсюда это очень похоже на то, что свойство Context IService является Leaky Abstraction . Службе не нужно ничего знать о структуре пользовательского интерфейса, в которой она работает.

Вы можете часто нарушить циклическую зависимость, изменив одного из потребителей на более управляемую событиями архитектуру.

Вот статья о такого рода проблемах .

Вот связанный ответ для ASP.NET MVC, который очень похож на ваш: Есть ли хороший / правильный способ решения проблемы цикла внедрения зависимостей в учебнике по ASP.NET MVC ContactsManager?

См. Также ответ: Dependency-Injection для разрешения циклических зависимостей

2
ответ дан 2 September 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: