Как вы уже заметили, что это новый (и действительно полезная функция) Единения 2. Эта функция позволяют Вам
- параметры переходят к конструктору в тот момент, когда вы разрешить класс. В единстве 1 можно установить только одно значение в тот момент, когда вы регистрируетесь типа с помощью нового InjectionConstructor (...)
Существует ParameterOverride : ResolverOverride
ResolverOverride класс, который позволяет переопределить именованный параметр передан в конструктор .
- же для зависимостей с
DependencyOverride : ResolverOverride
класса, который переопределяет значение впрыскиваемых всякий раз, когда существует зависимости данного типа, независимо от того, где он появляется в объекте граф.
- же для свойств с
PropertyOverride : ResolverOverride
ResolverOverride, что позволяет переопределить значение для указанного свойства.
Пример
using System;
using Microsoft.Practices.Unity;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
var container = new UnityContainer();
//ParameterOverride example
container.RegisterType<IConcreteService, ConcreteService>(
new InjectionConstructor(7) //Old way to pass value to constructor - not flexible.
//All resolved (without ovverride wich aapears only in unity 2.0) classes will hav val=7
);
var service0 = container.Resolve<IConcreteService>();
Console.WriteLine(service0.Val); //prints 7
var service = container.Resolve<IConcreteService>(new ParameterOverride("val", 3));
Console.WriteLine(service.Val); // prints 3
var service2 = container.Resolve<IConcreteService>(new ParameterOverride("val", 5));
Console.WriteLine(service2.Val); // prints 5
Console.ReadLine();
//DependencyOverride example
var b0 = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(42)));
Console.WriteLine(b0.Service.Val); //print 42
Console.WriteLine(b0.Service1.Val); //print 42
var b = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(-42)));
Console.WriteLine(b.Service.Val); // print -42
Console.WriteLine(b.Service1.Val); // print -42
Console.ReadLine();
//PropertyOverride example
var b1 = container.Resolve<B>(new PropertyOverride("Service", new ConcreteService(42)),
new PropertyOverride("Service1", new ConcreteService(-42)));
Console.WriteLine(b1.Service.Val); //print 42
Console.WriteLine(b1.Service1.Val); //print -42
Console.ReadLine();
}
}
public interface IConcreteService {
int Val { get; set; }
}
public class ConcreteService : IConcreteService {
public int Val { get; set; }
public ConcreteService(int val) {
Val = val;
}
}
public class B {
[Dependency]
public IConcreteService Service{ get; set; }
[Dependency]
public IConcreteService Service1 { get; set; }
}
}
Понятия не имею, почему Google хранит молчание по этому поводу.
Цитаты из исходных кодов Unity xml docs.
Спасибо за отличный ответ. +1 – Vadim
Это была отличная помощь. Очень хорошо объяснено. –
+1 Отличное объяснение! –