Замок Виндзор Внутренний Конструктор / Класс - PullRequest
6 голосов
/ 25 октября 2010

Я посмотрел на это, и он отвечает на половину моих вопросов:

Замок Виндзор: Зарегистрировать класс с внутренним конструктором?

Но можете ли вы использовать Виндзор, чтобы использовать внутренние конструкторы/ класс вместе с внедрением зависимости?(так что параметры конструктора тоже вводятся)?Я хотел бы оставить класс / конструктор внутренним, чтобы обеспечить оптимальную инкапсуляцию (эти классы не должны быть доступны общественности).

Мне нужно это для поддержки Silverlight, поэтому я не думаю, что этоопция:

Замок Виндзор: Как зарегистрировать внутренние реализации

Спасибо.

1 Ответ

7 голосов
/ 25 октября 2010

Это может не быть удовлетворительным ответом, но рекомендуется сделать общедоступными все классы, которые вам нужно создать, с помощью 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)
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...