Wie Sie bemerkt haben, ist dies eine neue (und wirklich coole) Funktion von Unity 2. Mit dieser Funktion können Sie
- Übergeben Sie die Parameter in dem Moment an den Konstruktor, in dem Sie die Klasse auflösen. In Einheit 1 können Sie in dem Moment, in dem Sie den Typ über den neuen InjectionConstructor registrieren (...), nur einen Wert festlegen.
Es gibt ParameterOverride : ResolverOverride
Eine ResolverOverride-Klasse, mit der Sie einen benannten Parameter überschreiben können, der an einen Konstruktor übergeben wird.
- Gleiches gilt für Abhängigkeiten mit
DependencyOverride : ResolverOverride
Eine Klasse, die den injizierten Wert überschreibt, wenn eine Abhängigkeit des angegebenen Typs besteht, unabhängig davon, wo sie im Objektdiagramm angezeigt wird.
- Gleiches gilt für Immobilien mit
PropertyOverride : ResolverOverride
Ein ResolverOverride, mit dem Sie den Wert für eine angegebene Eigenschaft überschreiben können.
Beispiel
using System;
using Microsoft.Practices.Unity;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
var container = new UnityContainer();
container.RegisterType<IConcreteService, ConcreteService>(
new InjectionConstructor(7)
);
var service0 = container.Resolve<IConcreteService>();
Console.WriteLine(service0.Val);
var service = container.Resolve<IConcreteService>(new ParameterOverride("val", 3));
Console.WriteLine(service.Val);
var service2 = container.Resolve<IConcreteService>(new ParameterOverride("val", 5));
Console.WriteLine(service2.Val);
Console.ReadLine();
var b0 = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(42)));
Console.WriteLine(b0.Service.Val);
Console.WriteLine(b0.Service1.Val);
var b = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(-42)));
Console.WriteLine(b.Service.Val);
Console.WriteLine(b.Service1.Val);
Console.ReadLine();
var b1 = container.Resolve<B>(new PropertyOverride("Service", new ConcreteService(42)),
new PropertyOverride("Service1", new ConcreteService(-42)));
Console.WriteLine(b1.Service.Val);
Console.WriteLine(b1.Service1.Val);
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; }
}
}
Ich habe keine Ahnung, warum Google darüber schweigt.
Zitate stammen aus XML-Dokumenten des Unity-Quellcodes.