Почему Unity использует инъекцию свойств при разрешении конкретного типа? - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть интерфейс:

 public interface IFoo{ 
     string Bar{ get; set; } 
 }

и реализация интерфейса

public class RealFoo{
    public string Bar{ get; set; }
    public string Qux{ get; set; }
}

Я настроил единицу через файл конфигурации, чтобы разрешить IFoo в RealFoo, используя свойствоинъекция:

<register type="Namespace.IFoo, Assembly" mapTo="Namespace.RealFoo, Assembly">
    <property name="Qux" value="somevalue" />
</register>

Если я вызываю Resolve (typeof (RealFoo)), мой экземпляр имеет .Qux, установленный на "somevalue".Как это возможно?Это ожидаемое поведение?Я понимаю, что если я вызову Resolve (typeof (IFoo)), то для .Qux будет установлено значение "somevalue", но я не могу объяснить, каким образом разрешение конкретного типа установит .Qux.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

При использовании регистрации единиц и параметров / конструкторов внедрения вы определяете их для типа, которому они соответствуют.Я не использую файлы конфигурации в единстве, но в коде это позволяет вам делать следующее:

unityContainer.RegisterType<IFoo, FooOne>("FooOne" new InjectionProperty("Qux", "somevalue"));
unityContainer.RegisterType<IFoo, FooTwo>("FooTwo", new InjectionProperty("Qux", "anothervalue"));

То есть разные конкретные типы могут иметь разные параметры / свойства впрыска.В единстве, если только регистрации не названы, используются последние зарегистрированные параметры бетонного впрыска.

Учитывайте следующее:

unityContainer.RegisterType<IFoo, FooOne>(new InjectionProperty("Qux", "somevalue"));
unityContainer.RegisterType<FooOne>(new InjectionProperty("Qux", "anothervalue"));

Если я тогда сделал либо unityContainer.Resolve<IFoo>(), либо unityContainer.Resolve<FooOne>() обабудет иметь «другое значение», вставленное в «Qux», поскольку оно разрешает как экземпляр FooOne, так и последнюю регистрацию, вводящую «Qux» как «другое значение».

0 голосов
/ 03 февраля 2012

Что еще вы ожидаете от этого?Он вводит зависимости для вас.Qux является зависимостью.Если ты не хочешь, чтобы это делалось, скажи это.Такое поведение согласуется с его поведением для конструкторов.

...