Создайте ISubDependencyResolver, который смотрит на атрибуты свойства / параметра - PullRequest
1 голос
/ 05 июля 2010

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

Например, скажем:

public class MyService
{
   public MyService([Selector("Bar")]SomeDependency foo){......}
}

Тогда я бы хотел внутри ISubDependencyResolver получить SelectorAttribute, получить его значение и разрешить его соответствующим образом.

Мы уже делаем это, но с атрибутами самого типа (скажем, атрибут в определении SomeDependency),Это просто, так как у вас есть ссылка на тип.У меня, однако, возникают проблемы с выяснением, как получить ссылку на параметр / свойство, которое в настоящее время разрешается, что позволило бы мне получить этот атрибут.

Кто-нибудь хочет поделиться своим пониманием?

Спасибо!

1 Ответ

1 голос
/ 06 июля 2010

IMO, это на самом деле переопределение сервиса, определенное встроенным, поэтому я бы отнесся к нему как таковому. Вместо того, чтобы пытаться реализовать это в ISubDependencyResolver, я бы использовал вкладчик компонентной модели (IContributeComponentModelConstruction).

Проблема в том, чтобы сделать это, я не вижу другого способа, кроме замены ConstructorDependenciesModelInspector по умолчанию своим собственным (это было бы очень похоже, но это также прочитало бы SelectorAttribute, и при обнаружении создаст DependencyModel с DependencyType.ServiceOverride.

Для замены ConstructorDependenciesModelInspector используйте container.Kernel.ComponentModelBuilder.

...