Windsor Container: как указать, что публичное свойство не должно заполняться контейнером?

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

Как я могу прямо сказать Castle Windsor, что он не должен пытаться удовлетворить общедоступную собственность? Я предполагаю, что в этой степени должен быть атрибут. Однако я не могу его найти, поэтому дайте мне знать соответствующее пространство имен / сборку.

Если есть какой-либо способ сделать это без атрибутов (таких как конфигурация XML или конфигурация через код), это было бы предпочтительнее, поскольку конкретная библиотека, в которой это происходит, до сих пор не нуждалась в зависимости от замка.


person George Mauer    schedule 07.10.2008    source источник
comment
Добавлен этот вопрос в FAQ Виндзора: using.castleproject.org/display/IoC/FAQ   -  person Mauricio Scheffer    schedule 24.01.2010


Ответы (7)


Вы можете использовать Castle.Core. DoNotWireAttribute, чтобы предотвратить подключение свойства контейнером IoC (он находится в сборке Castle.Core, что означает, что ваша библиотека должна зависеть только от облегченной сборки Castle.Core - если, например, вы хотите использовать код без инверсии контейнера управления или в другом контейнере IoC).

Я не верю, что есть какой-либо способ предотвратить возникновение проводки в конфигурации Xml, но было бы достаточно легко добавить поддержку для этого - если бы мне пришлось это сделать, я бы, вероятно,:

  1. Добавьте какой-нибудь атрибут в объявление свойства в xml: ‹myprop wire =" false "/›
  2. Наследовать от
  3. Наследовать от kernel.GetHandler(typeof(MyComponent)).ComponentModel.Dependencies.RemoveAll(d => d.DependencyKey == "PropertyThatShouldNotBeWired");

    YMMV с таким подходом, особенно если у вас есть запускаемые службы или другие средства, которые могут с нетерпением создавать экземпляр вашего компонента после его регистрации.

    person Bittercoder    schedule 08.10.2008
    comment
    Этот пример кода не работает в 2.5.x - метод RemoveAll() пропал. Есть ли альтернатива? - person Neil Barnwell; 02.08.2011
    comment
    P.S. Я использую API быстрой регистрации. - person Neil Barnwell; 02.08.2011

Я создал средство, чтобы помочь с этим:

person George Mauer    schedule 01.09.2009
comment
@GorgiRankovski Я не уверен, что этот пакет актуален для современных версий Castle.Windsor (сейчас я использую Structuremap или Autofaq, поэтому не знаю). Вы можете получить исходный код из этого старого svn в коде Google - person George Mauer; 04.04.2014

Я не знаю, какую версию Castle вы, ребята, использовали в то время, но ни одно из упомянутых решений не работало. Плюс много мертвых ссылок.

С замком 3.1 вот решение, которое я придумал (благодаря некоторому копанию исходного кода замка):

container.Register(Component.For(type)
                                        .LifestyleTransient()
                                        .Properties( propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType)));

Функция «Свойства» добавляет фильтр свойств, используемый Castle при построении ComponentModel. В моем случае будут удовлетворены все зависимости свойств, кроме типа свойства MyOtherType.

person Jean-Francois    schedule 16.09.2013

Может кому будет полезно. В Windsor 4.1 есть метод PropertiesIgnore при регистрации.

Component.For<Role>().LifestyleTransient().PropertiesIgnore((model, propertyInfo) => true)
person breeze393    schedule 21.11.2018


Этого можно добиться с помощью следующего кода:

var container = new WindsorContainer();

// We don't want to inject properties, only ctors
var propInjector = container.Kernel.ComponentModelBuilder
                         .Contributors
                         .OfType<PropertiesDependenciesModelInspector>()
                         .Single();
container.Kernel.ComponentModelBuilder.RemoveContributor(propInjector);

Источник Castle Windsor Documentation

person gleng    schedule 12.02.2019

Разместил это также на форуме групп Google здесь: http://groups.google.com/group/castle-project-devel/browse_thread/thread/43aa513817bd057a

person George Mauer    schedule 08.10.2008