Я пытался следовать своему сценарию, и этот пример работает
var container = new UnityContainer();
container.RegisterType<IFoo, One>("1", new InjectionProperty("Bar", "1"));
container.RegisterType<IFoo, Two>("2", new InjectionProperty("Bar", "2"));
container.RegisterType<IFoo, Three>("3", new InjectionProperty("Bar", "3"));
One one = new One();
container.BuildUp(one.GetType(), one, "1");
Assert.AreEqual("1", one.Bar);
public interface IFoo
{
string Bar { get; set; }
}
public class One : IFoo
{
public string Bar { get; set; }
}
public class Two : IFoo
{
public string Bar { get; set; }
}
public class Three : IFoo
{
public string Bar { get; set; }
}
Update
var container = new UnityContainer();
container.RegisterType<Person>(new InjectionProperty("Foo"));
container.RegisterType<IFoo, One>("1");
container.RegisterType<IFoo, Two>("2");
container.RegisterType<IFoo, Three>("3");
Person person = container.Resolve<Person>("1");
Assert.IsNotNull(person.Foo);
Assert.IsInstanceOfType(person.Foo, typeof(One));
public class Person
{
public IFoo Foo { get; set; }
}
Я думаю, это то, что вы имеете в виду? Короткий ответ: Это не так, как работает Unity.
Длинный ответ: вам нужно указать ResolverOverride
, который сделает это за вас. Но даже этого недостаточно, так как вы хотите, чтобы контейнер создавал значение, которое вы хотите ввести для вас. Поэтому вам нужно указать ResolvedParameter
в качестве значения для вашего ResolverOverride
. С вышедших из коробки частей Единству Resolve
будет выглядеть следующим образом
Person person = container.Resolve<Person>(new PropertyOverride("Foo", new ResolvedParameter(typeof(IFoo), "1")));
Или вы можете использовать этот обычай переопределение вместо
public class NamedPropertyOverride : ResolverOverride
{
private readonly string propertyName;
private readonly string registrationName;
public NamedPropertyOverride(string propertyName, string registrationName)
{
this.propertyName = propertyName;
this.registrationName = registrationName;
}
public override IDependencyResolverPolicy GetResolver(IBuilderContext context, Type dependencyType)
{
var currentOperation = context.CurrentOperation as ResolvingPropertyValueOperation;
if (currentOperation != null &&
currentOperation.PropertyName == this.propertyName)
{
Type propertyType = currentOperation
.TypeBeingConstructed
.GetProperty(currentOperation.PropertyName, BindingFlags.Instance | BindingFlags.Public)
.PropertyType;
return new NamedTypeDependencyResolverPolicy(propertyType, this.registrationName);
}
return null;
}
}
Измените строку, которая содержит призыв к Resolve
в вышеуказанном образец к этому
Person person = container.Resolve<Person>(new NamedPropertyOverride("Foo", "1"));
Это должно сделать трюк.
Попробуйте указать тип интерфейса вместо конкретных реализаций. Тип для метода «BuildUp» –
Спасибо, Себастьян, но это не главное. Если я зарегистрирую один интерфейс с одним типом, метод _container.BuildUp (myAttribute.GetType(), myAttribute) работает без проблем. Проблема возникает только при использовании имени сопоставления. – user1350775