2010-01-12 17 views

Odpowiedz

21

Resolve jest używany, gdy chcesz pojemnik Unity do skonstruowania instancji (nowy tylko gdy jest to potrzebne lub istniejącą wcześniej pojedyncza) wstrzyknąć jego zależności i przekazać wam odwołanie do obiektu .

BuildUp jest używany, gdy masz już instancję obiektu i chcesz, aby kontener po prostu rozwiązał i wstrzyknął zależności.

Teardown jest przeciwieństwem BuildUp. Możesz przekazać swój obiekt do metody Teardown kontenera, aby zamknąć/posprzątać/cokolwiek chcesz. Istniejące zachowanie kontenera nie działa w czasie Czasu usuwania, ale można skorzystać z rozszerzeń, aby je wykorzystać. Możesz również spowodować, że twoje obiekty zaimplementują IDisposable, a kontener wywoła funkcję Dispose() na twoim obiekcie, gdy zostanie on usunięty.

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

Po co Rafa powiedział, staje się oczywiste, że w przeciwieństwie do Resolve()BuildUp() nie pomaga z wtryskiem konstruktor. Typowym scenariuszem jest tworzenie obiektu gdzieś na zewnątrz, przekazywanie go jako parametru i budowanie go w środku. (Zewnętrzne i wewnętrzne odnoszą się do treści metody.) Ponadto może być konieczne wywołanie obiektu Teardown() w celu wyczyszczenia obiektu i przywrócenia go do stanu, w którym był przed przekazaniem jako parametr. Uważaj jednak, ponieważ Unity wbudowane w Teardown() nic nie robi, jest to rodzaj elementu zastępczego odpowiedniego do nadpisywania.

Przykładem może być obiekt drukarki. Po utworzeniu jednego nazwać to w wielu innych sposobów każdorazowo wstrzykiwanie inny nagłówek/stopkę:

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