Как добавить тип пересылки в существующую регистрацию Castle Windsor - PullRequest
2 голосов
/ 08 июля 2011

В настоящее время я регистрирую кучу вещей в одной точке моей последовательности инициализации

Container.Register(AllTypes.FromAssemblyContaining<MyAssembly>()
    .BasedOn(typeof(IRepository<>))
    .WithService.Self().Configure(c => c.LifeStyle.Transient));

Я использую WithService.Self, чтобы он автоматически не принимал AllInterfaces, чтобы интерфейскоторый я захочу добавить позже, так как переадресация типов еще не была добавлена.

Я бы хотел потом (позже), чтобы иметь возможность добавить переадресацию типов к одному из уже зарегистрированных компонентов, иIntellisense для свойства ForwardedTypes предлагает использовать .Forward (typof ()), например,

Container.Register(Component.For<IOtherInterface>()
    .Forward(typeof(IOtherInterface))
    .ImplementedBy<AlreadyRegisteredType>().LifeStyle.Transient);

Возможно ли это?

РЕДАКТИРОВАТЬ:

Я пытался получитьМатериал, который Кшиштоф предложил поработать, поэтому я создал тестовый проект (ниже).Я пробовал различные комбинации, чтобы заставить ConfigureFor пересылать IMyInterface в MySecondType, но просто не могу заставить его работать, когда это делается в качестве второго шага после начальной регистрации типов моих компонентов.Я, вероятно, неясен, но я просто не понимаю, как работает команда ConfigureFor, и документация немного отрывочна (не существует) по этому вопросу.

namespace TestProject1
{
    public class MyType : IMyInterface
    {
        public virtual string MyProperty { get; set; }
    }

    public class MySecondType : IMyInterface
    {
        public virtual string MySecondProperty { get; set; }
    }

    public interface IMyInterface
    {
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            //New Container
            var container = new WindsorContainer();

            //Register Types
            container.Register(
                AllTypes.FromAssemblyContaining<MyType>().BasedOn<IMyInterface>().WithService.Self().Configure(
                    c => c.LifeStyle.Transient));

            //Other stuff happens here...

            //Now Register our interface as a forward
            container.Register(AllTypes.FromAssemblyContaining<IMyInterface>()
                    .BasedOn<IMyInterface>()
                    .WithService.Base()
                    .ConfigureFor<IMyInterface>(r => r.Forward<MySecondType>()).Configure(c => c.LifeStyle.Transient));

            var typeA = new MySecondType();
            var typeB = container.Resolve<IMyInterface>();

            Assert.IsInstanceOfType(typeB.GetType(), typeA.GetType());

        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2011

То, что вы описали в комментарии, - это регистрация другого компонента для AlreadyRegisteredType.

Если вы хотите добавить пересылку к тому же компоненту, используйте

ConfigureFor<AlreadyRegisteredType>(c => c.Forward<IOtherInterface>())

полный пример:

Container.Register(AllTypes.FromThisAssembly()
                    .BasedOn<IEmptyService>()
                    .WithService.Base()
                    .ConfigureFor<EmptyServiceComposite>(r => r.Forward<EmptyServiceComposite>()));
0 голосов
/ 06 июля 2016

Как только вы зарегистрировали тип

Container.Register(Component.For<SomeType>());

Вы можете перенаправить некоторый интерфейс к нему следующим образом:

Container.Register(Component.For<ISomeInterface>()
    .UsingFactoryMethod<ISomeInterface>(kernel => kernel.Resolve<SomeType>()));
...