2010-01-12 13 views

Antwort

21

Resolve wird verwendet, wenn Sie die Einheit Container wollen (nur ein neues, wenn Sie es oder eine vorbestehende Singleton benötigen), um die Instanz zu konstruieren, dessen Abhängigkeiten injizieren und die Referenz auf das Objekt übergeben .

BuildUp wird verwendet, wenn Sie bereits eine Instanz des Objekts haben und möchten, dass der Container seine Abhängigkeiten auflöst und eingibt.

Teardown ist das Gegenteil von BuildUp. Sie können Ihr Objekt an die Teardown-Methode des Containers übergeben, um herunterzufahren/aufzuräumen/was auch immer Sie wollen. Das Verhalten des vorhandenen Containers tut zur Zeit des Herunterfahrens nichts, aber Erweiterungen können geschrieben werden, um dies zu nutzen. Sie können auch bewirken, dass Ihre Objekte IDisposable implementieren, und der Container wird Dispose() für Ihr Objekt aufrufen, wenn es sich selbst entsorgt.

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

Nachdem was Rafa sagte sich heraus, dass im Gegensatz zu Resolve()BuildUp() nicht mit Ctor Injektion hilft. Ein häufiges Szenario ist, wenn Sie Ihr Objekt irgendwo außerhalb erstellen, es als Parameter übergeben und es innen aufbauen. (Außen und Innen beziehen sich auf den Hauptteil einer Methode.) Außerdem müssen Sie möglicherweise Teardown() aufrufen, um das Objekt zu bereinigen und es in den Zustand zurückzuversetzen, in dem es vor der Übergabe als Parameter war. Aber Vorsicht, da Unity Teardown() nichts tut, ist es ein Platzhalter, der sich zum Überschreiben eignet.

Ein Beispiel könnte ein Druckerobjekt sein. Nachdem Sie einen erstellt haben, rufen Sie ihn in einer Reihe von anderen Methoden auf, wenn Sie unterschiedliche Kopf-/Fußzeilen einfügen:

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(); 
    } 
} 
Verwandte Themen