Это может не быть удовлетворительным ответом, но рекомендуется сделать общедоступными все классы, которые вам нужно создать, с помощью Castle, с помощью общедоступных конструкторов.Ваш дизайн должен позволять нижестоящей зависимости создавать экземпляры ваших объектов, не полагаясь на Castle или InternalsVisibleTo.
На ваш вопрос Castle будет искать только общедоступных конструкторов для создания объекта.Я не верю, что есть способ заставить его искать внутренних или частных конструкторов.Однако, если ваш класс является внутренним, вы можете сделать ваши внутренние конструкторы общедоступными, не изменяя инкапсуляцию вообще.Смотрите следующий тестовый пример:
[TestFixture]
public class InternalConstructorTests
{
[Test]
public void Test()
{
using (var container = new WindsorContainer())
{
container.Register(
Component.For<IFoo>().ImplementedBy<Foo>(),
Component.For<IBar>().ImplementedBy<Bar>(),
Component.For<IBaz>().ImplementedBy<Baz>()
);
// fails because Castle can't find, and won't call, the internal constructor
Assert.Throws<ComponentActivatorException>(()=>container.Resolve<IFoo>());
// passes because the Baz constructor is public, but the "real" encapsulation
// level is the same because the class is internal, effectively making the
// public constructor internal as well
container.Resolve<IBaz>();
}
}
}
internal interface IBar{}
internal class Bar : IBar{}
internal interface IFoo{}
internal class Foo : IFoo
{
internal Foo(IBar bar)
{
}
}
internal interface IBaz { }
internal class Baz : IBaz
{
public Baz(IBar bar)
{
}
}