Замок Виндзор Карта назвал компонент для конкретной собственности - PullRequest
2 голосов
/ 17 февраля 2011

Следующий сценарий:

Мы используем Fluent API для регистрации всех компонентов в сборке и двух компонентов tyepof (A) с именованными ключами.Другой класс B с двумя свойствами typeof (A) должен вводить именованные компоненты.

Пример:

public class A : IA {}

public class B : IB
{
    [Named("first")]
    public IA First { get; set; }

    [Named("second")]
    public IA Second { get; set; }
}

// ...

container.Register(Component.For<IA>().Instance(new A(value1)).Named("first"));
container.Register(Component.For<IA>().Instance(new A(value2)).Named("second"));

// ...
var b = container.Resolve<IB>(); // named instances of A get injected to B using the Named attribute

Возможно ли это с таким атрибутом, как Named, или только с Xml Config?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Стандартный способ сделать это в Виндзоре - использовать переопределение службы . В вашем примере, когда вы регистрируете B, вы делаете это так:

container.Register(Component.For<IB>().ImplementedBy<B>()
                     .ServiceOverrides(new {First = "first", Second = "second"}));

(есть другие способы выразить это, проверьте связанные документы)

Использование атрибута Named в качестве предложения загрязняет код несвязанными проблемами (B не должно заботиться о том, какие A s вводятся)

1 голос
/ 03 июня 2017

Вот как вы можете решить эту проблему, используя DependsOn и включив выражение nameof (введено в C # 6.0):

container.Register
(
    Component.For<IA>()
        .Instance(new A(value1))
        .Named("first"),
    Component.For<IA>()
         .Instance(new  A(value2))
         .Named("second"),
    Component.For<IB>()
          .ImplementedBy<B>()
          .DependsOn
          (
              Dependency.OnComponent(nameof(B.First), "first"),
              Dependency.OnComponent(nameof(B.Second), "second")
          )      
)

Dependency.OnComponent имеет много переопределений, но в этом случае первый параметр - это имя свойства, а второй параметр - имя компонента.

См. здесь для получения дополнительной документации.

...