Замок Windsor: Как указать параметр конструктора из кода?

Проблема с Xiaomi Если возможно, обновите MIUI до последней версии, перейдите в «Настройки»> «Дополнительные настройки»> «Параметры разработчика»> «Параметры разработчика»: установите флажок «Установить через USB».

Это решило мою проблему, надеюсь, решите вашу удачу!

11
задан Charlie 20 July 2015 в 16:08
поделиться

4 ответа

Править: Используемый ответы ниже кода с Быстрым Интерфейсом :)

namespace WindsorSample
{
    using Castle.MicroKernel.Registration;
    using Castle.Windsor;
    using NUnit.Framework;
    using NUnit.Framework.SyntaxHelpers;

    public class MyComponent : IMyComponent
    {
        public MyComponent(int start_at)
        {
            this.Value = start_at;
        }

        public int Value { get; private set; }
    }

    public interface IMyComponent
    {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture
    {
        [Test]
        void ResolvingConcreteImplShouldInitialiseValue()
        {
            IWindsorContainer container = new WindsorContainer();

            container.Register(
                Component.For<IMyComponent>()
                .ImplementedBy<MyComponent>()
                .Parameters(Parameter.ForKey("start_at").Eq("1")));

            Assert.That(container.Resolve<IMyComponent>().Value, Is.EqualTo(1));
        }

    }
}
16
ответ дан 3 December 2019 в 06:49
поделиться

Необходимо передать в IDictionary, когда Вы просите у контейнера экземпляр.

Вы использовали бы эту перегрузку Твердости IWindsorContainer:

T Resolve<T>(IDictionary arguments)

или не универсальный:

object Resolve(Type service, IDictionary arguments)

Так, например: (принятием контейнера является IWindsorContainer),

IDictionary<string, object> values = new Dictionary<string, object>();
values["start_at"] = 1;
container.Resolve<IMyComponent>(values);

Обратите внимание, что значения ключа в словаре чувствительны к регистру.

0
ответ дан 3 December 2019 в 06:49
поделиться

Вы рассмотрели использование Binsor для конфигурирования контейнера? Вместо подробного и неуклюжего XML можно настроить Виндзор с помощью Шиканья базирующийся DSL. Вот то, на что будет похожа Ваша конфигурация:

component IMyComponent, MyComponent:
   start_at = 1

Преимущество состоит в том, что Вы имеете покорный файл конфигурации, но избегаете проблем с XML. Также Вы не должны перекомпилировать для изменения конфигурации, как Вы были бы при конфигурировании контейнера в коде.

Существует также много вспомогательных методов, которые включают нулевую конфигурацию трения:

  for type in Assembly.Load("MyApp").GetTypes():
    continue unless type.NameSpace == "MyApp.Services"
    continue if type.IsInterface or type.IsAbstract or type.GetInterfaces().Length == 0
    component type.GetInterfaces()[0], type

Можно начать с ним здесь.

1
ответ дан 3 December 2019 в 06:49
поделиться

Можно использовать метод AddComponentWithProperties интерфейса IWindsorContainer для регистрации сервиса в расширенных свойствах.

Ниже 'рабочий' образец выполнения этого с Модульным тестом NUnit.

namespace WindsorSample
{
    public class MyComponent : IMyComponent
    {
        public MyComponent(int start_at)
        {
            this.Value = start_at;
        }

        public int Value { get; private set; }
    }

    public interface IMyComponent
    {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture
    {
        [Test]
        void ResolvingConcreteImplShouldInitialiseValue()
        {
            IWindsorContainer container = new WindsorContainer();
            IDictionary parameters = new Hashtable {{"start_at", 1}};

            container.AddComponentWithProperties("concrete", typeof(IMyComponent), typeof(MyComponent), parameters);

            IMyComponent resolvedComp = container.Resolve<IMyComponent>();

            Assert.That(resolvedComp.Value, Is.EqualTo(1));
        }

    }
}
-1
ответ дан 3 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: