Вот пример кода:
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 это?
У вас есть Циклическая зависимость .
UsersController
зависит от IService
IService
зависит от ControllerContext
ControllerContext
зависит от UsersController
Нет DI Контейнер может проникнуть внутрь ваших классов и контролировать то, что там происходит. Они могут устанавливать для вас зависимости и внедрять их в ваши классы извне. Однако они не могут хорошо справиться с циклическими зависимостями, поэтому лучший вариант - изменить дизайн API.
Отсюда это очень похоже на то, что свойство Context IService
является Leaky Abstraction . Службе не нужно ничего знать о структуре пользовательского интерфейса, в которой она работает.
Вы можете часто нарушить циклическую зависимость, изменив одного из потребителей на более управляемую событиями архитектуру.
Вот статья о такого рода проблемах .
Вот связанный ответ для ASP.NET MVC, который очень похож на ваш: Есть ли хороший / правильный способ решения проблемы цикла внедрения зависимостей в учебнике по ASP.NET MVC ContactsManager?
См. Также ответ: Dependency-Injection для разрешения циклических зависимостей