Comme vous l'avez remarqué, c'est un nouveau (et vraiment cool) de l'Unité 2. Cette fonction vous permettent de
- passer des paramètres au constructeur dans le moment où vous résoudre la classe. Dans l'unité 1, vous pouvez définir qu'une seule valeur dans le moment où vous vous inscrivez type par le biais des nouvelles InjectionConstructor(...)
Il est ParameterOverride : ResolverOverride
Un ResolverOverride classe qui vous permet de
remplacer un nom de paramètre passé à une
constructeur.
- même pour les dépendances avec
DependencyOverride : ResolverOverride
Une classe qui remplace la valeur
injecté à chaque fois qu'il y a un
la dépendance d'un type donné,
indépendamment de l'endroit où il apparaît dans le
objet graphique.
- même pour les propriétés avec
PropertyOverride : ResolverOverride
Un ResolverOverride qui vous permet de remplacer la valeur de la propriété spécifiée.
Exemple
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; }
}
}
N'ai aucune idée de pourquoi est-ce que google garde le silence à ce sujet.
Les citations sont de l'Unité de code source xml docs.