Поскольку вы зарегистрировали фабрику контроллеров, которая использует Windsor, именно контейнер IoC Windsor отвечает за разрешение всех ваших экземпляров контроллера по мере необходимости.
То есть, когда вы получаете доступ к URL-адресу в вашем MVC-проекте, который указывает на действие «Индекс» в вашем «HomeController», ваш WindsorControllerFactory будет запрашивать инфраструктуру MVC экземпляр HomeController.
Если у этого контроллера есть конструктор, который принимает экземпляр IRepository , и вы зарегистрировали IRepository как службу с контейнером , тогда Windsor будет знать, как удовлетворить зависимость класса HomeController. Поэтому он может сначала преобразовать IRepository в некоторый конкретный класс, создать его экземпляр и передать его в качестве параметра конструктору HomeController перед возвратом экземпляра HomeController в инфраструктуру MVC.
Если вам нужны разные реализации IRepository для разных целей (например, UserRepository и ProductRepository), вы можете создать для них отдельные интерфейсы, каждый из которых расширяет IRepository, например ::
public interface IProfileRepository : IRepository {}
Затем вы можете использовать свободный интерфейс регистрации Windsor для регистрации всех конкретных классов, реализующих IRepository, и регистрации их в конкретной службе, которую они предоставляют, например, IProfileRepository.
Если вы сделаете это, Windsor автоматически разрешит все экземпляры, которые реализуют IRepository, без необходимости писать новый регистрационный код при добавлении новой реализации.
Что касается зависимости классов репозитория от ISession, вы можете сделать это несколькими способами. Я бы порекомендовал , а не , позволяя им напрямую зависеть от сеанса, а скорее позволить им зависеть от класса, через который они могут получить текущий сеанс (чтобы вы могли совместно использовать сеансы между репозиториями). В Интернете много информации о том, почему это хорошая практика, просто выполните поиск.
Теперь, что касается фактического осуществления этого, вы можете:
Зарегистрируйте экземпляр класса (по интерфейсу), который будет извлекать для вас сеанс с Windsor и позволит Windsor разрешить этот класс в качестве параметра для ваших конструкторов репозитория.
Зарегистрируйте ISession в Windsor и используйте заводской метод, чтобы получить его после разрешения.