2010-01-12 6 views

Répondre

21

Resolve est utilisé lorsque vous voulez que le conteneur de l'unité pour construire l'instance (un nouveau juste au moment où vous en avez besoin ou un singleton pré-existante), injecter ses dépendances et vous remettre la référence à l'objet .

BuildUp est utilisé lorsque vous avez déjà une instance de l'objet et souhaitez que le conteneur résolve et injecte ses dépendances.

Teardown est l'opposé de BuildUp. Vous pouvez passer votre objet à la méthode Teardown du conteneur pour fermer/nettoyer/ce que vous voulez. Le comportement du conteneur existant ne fait rien au moment du retrait, mais des extensions peuvent être écrites pour en tirer parti. Vous pouvez également rendre vos objets implémentent IDisposable, et le conteneur appellera Dispose() sur votre objet lorsqu'il est lui-même éliminé.

IMyService service = container.Resolve<MyService>(); // New service or pre-existing singleton 

IMyService service = GetMyService(); // Get the instance from some source 
container.BuildUp(service); // Inject dependencies 
container.Teardown(service); // Clean-up 
0

Après avoir dit ce que Rafa, il devient évident que, contrairement à Resolve()BuildUp() ne vous aide pas à l'injection de cteur. Un scénario commun est lorsque vous créez votre objet quelque part à l'extérieur, passez-le en paramètre et construisez-le à l'intérieur. (L'extérieur et l'intérieur se rapportent au corps d'une méthode.) De plus, vous devrez peut-être appeler le Teardown() pour nettoyer l'objet et le rétablir à l'état qu'il était avant de passer en paramètre. Méfiez-vous cependant, puisque l'unité Teardown() d'Unity ne fait rien, c'est un genre d'espace réservé approprié pour le dépassement.

Une exampe peut être un objet imprimante. Après en avoir créé un, vous l'appelez dans un certain nombre d'autres méthodes chaque fois que vous injectez un en-tête/pied de page différent:

public class Decorations 
{ 
    public string Header { get; set; } 

    public string Footer { get; set; } 
} 

public class Printer 
{ 
    internal void Print(string message) 
    { 
     Console.WriteLine("HEADER: {0}", this.Decorations != null 
      && this.Decorations.Header != null 
       ? this.Decorations.Header 
       : string.Empty); 
     Console.WriteLine(message); 
     Console.WriteLine("FOOTER: {0}", this.Decorations != null 
      && this.Decorations.Footer != null 
       ? this.Decorations.Footer 
       : string.Empty); 
    } 

    [Dependency] 
    public Decorations Decorations { get; set; } 
} 

public class ClassA 
{ 
    public void Print(Printer printer, IUnityContainer container) 
    { 
     container.BuildUp(printer); 
     printer.Print("Hello from ClassA"); 
     container.Teardown(printer); 
    } 
} 

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var printer = new Printer(); 

     var containerA = new UnityContainer(); 
     containerA.RegisterInstance(new Decorations { 
      Header = "I am HEADER from Decorations #1", 
      Footer = "I am FOOTER from Decorations #1" }); 
     var containerB = new UnityContainer(); 
     containerB.RegisterInstance(new Decorations { 
      Header = "--- I am HEADER from Decorations #2 ---", 
      Footer = "--- I am FOOTER from Decorations #2 ---" }); 

     var a = new ClassA(); 

     a.Print(printer, containerA); 
     a.Print(printer, containerB); 

     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(); 
    } 
}