68 votes

Unity 2.0: Comment utiliser Resolve avec ResolverOverride?

J'ai commencé à travailler de plus en plus avec Unity . Je remarque que la méthode Resolver prend un argument params ResolverOverride .

Quelqu'un peut-il me donner un exemple d'utilisation de ResolverOverride ou indiquer une autre source permettant d'obtenir davantage d'indices?

111voto

er-v Points 2697

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.

46voto

Konamiman Points 20578

Juste au cas où quelqu'un serait intéressé, j'ai créé une méthode d'extension qui facilite la lecture de la syntaxe de résolution à l'aide de ParameterOverride . La méthode est la suivante:

 public static class UnityExtensions
{
    public static T Resolve<T>(this IUnityContainer container, object parameterOverrides)
    {
        var properties = parameterOverrides
            .GetType()
            .GetProperties(BindingFlags.Public | BindingFlags.Instance);
        var overridesArray = properties
            .Select(p => new ParameterOverride(p.Name, p.GetValue(parameterOverrides, null)))
            .Cast<ResolverOverride>()
            .ToArray();
        return container.Resolve<T>(null, overridesArray); //null needed to avoid a StackOverflow :)
    }
}
 

Avec cela, vous pouvez réécrire l'exemple ParameterOverride comme suit:

 var service = container.Resolve<IConcreteService>(new {val=3});
 

J'espère que c'est utile pour quelqu'un ...

14voto

Ciaran O'Neill Points 1096

Juste pour ajouter mon 2c. Vous pouvez simplement ajouter un ParameterOverrides comme ceci:

 Container.Resolve<IConcreteService>(new ParameterOverrides
{                                                                                   
  {"val", 42}
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X