У меня есть следующий установщик, но по какой-то нечетной причине он не разрешает правильно. У меня есть интерфейс, в котором есть 2 реализации, но вы хотите ввести правильный экземпляр на основе naming conventions
.Замок Виндзор несколько реализаций интерфейса
Я ожидаю в этом случае, что правильный экземпляр ICommand
будет введен в соответствии с их именем. Однако по какой-то нечетной причине оба контроллера выбирают самый первый экземпляр, то есть FooCommand
из-за его определения сначала в установщике.
Не уверен, что я сделал неправильно? Возможно, есть ли альтернативный способ сделать это?
public interface ICommand { }
public class FooCommand : ICommand { }
public class BarCommand : ICommand { }
public class SomeController : ApiController
{
public SomeController(ICommand fooCommand) { }
}
public class HelloController : ApiController
{
public HelloController(ICommand barCommand) { }
}
container.Register(
Component.For<ICommand>()
.Named("fooCommand")
.ImplementedBy<FooCommand>()
.LifestyleSingleton(),
Component.For<ICommand>()
.Named("barCommand")
.ImplementedBy<BarCommand>()
.LifestyleSingleton());
Так что вы хотите, чтобы ввести '' FooCommand' в SomeController' и '' BarCommand' в HelloController'? Но что происходит с этими контроллерами, если вы меняете зависимости, т. Е. Вводите 'BarCommand' в' SomeController'? Разве это прерывает 'SomeController' или он будет продолжать функционировать правильно? – Steven
Это сломает его, так как они оба будут разговаривать с разными базовыми таблицами. –
В этом случае вы нарушаете [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle), и это корень вашей проблемы. Чтобы решить эту проблему, дайте обеим командам собственный уникальный интерфейс. – Steven