Хм, это ужасно, но есть один способ (в прошлом мне приходилось делать это с объектами Linq2Sql DataContext).Вы создаете класс декоратора и регистрируете его вместо этого.
Допустим, у вас есть этот интерфейс:
public interface IService
{
void DoSomething();
}
И у вас есть реализация следующим образом:
public class Service : IService
{
private readonly ILogger _logger;
public Service(ILogger logger)
: this(logger, SomeDefaultListOfThings())
{
}
// Let's say Windsor is calling this ctor for some reason (ArrayResolver?)
public Service(ILogger logger, IEnumerable<object> emptyArrayFromWindsor)
{
_logger = logger;
PutTheItemsSomewhere(emptyArrayFromWindsor);
}
public void DoSomething()
{
// Something that relies on the list of items...
}
}
Нокак показывает пример, по какой-то причине Виндзор вызывает неправильный ctor, и вы не можете убедить его в обратном (как верно указывает Кшиштоф).Затем вы можете создать класс декоратора следующим образом, который имеет только один конструктор и, таким образом, устраняет неоднозначность:
public class SpecificCtorServiceDecorator : IService
{
private readonly IService _decorated;
public SpecificCtorServiceDecorator(ILogger logger)
{
_decorated = new Service(logger);
}
public void DoSomething()
{
_decorated.DoSomething();
}
}
Затем вы зарегистрируете этот класс вместо:
container.Register(
Component.For<IService>()
.ImplementedBy<SpecificCtorServiceDecorator>());
Конечно, было бы лучше, если бы не происходила эта странная вещь по умолчанию-значения-в-других-конструкторах ( поиск "Внедрение зависимости бедного человека" ), но в том случае, если выВы не управляете классом, который вам действительно нужен (как я был в Linq2Sql, или если это будет серьезное изменение API), тогда это может избавить вас от неприятностей.