Автоматически устанавливать свойство после создания компонента с помощью Autofac - PullRequest
1 голос
/ 19 июля 2010

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

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 или есть стандартный способ сделать это?

1 Ответ

2 голосов
/ 19 июля 2010

Что у вас есть Круговая зависимость .

  • UsersController зависит от IService<User>
  • IService<User> зависит от ControllerContext
  • ControllerContext зависит от UsersController

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

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

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

Вот статья об этой проблеме .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...