2010-01-12 9 views

Respuesta

21

Resolver se utiliza cuando se desea que el contenedor de la Unidad para la construcción de la instancia (uno nuevo justo cuando lo o un preexistente Singleton necesita), inyecte sus dependencias y te dará la referencia al objeto .

BuildUp se usa cuando ya tiene una instancia del objeto y desea que el contenedor simplemente resuelva e inyecte sus dependencias.

Desmontaje es lo opuesto a BuildUp. Puedes pasar tu objeto al método de desmontaje del contenedor para cerrar/limpiar/lo que quieras. El comportamiento de contenedor existente no hace nada en tiempo de Desmontaje, pero se pueden escribir extensiones para aprovechar esto. También puede hacer que sus objetos implementen IDisposable, y el contenedor llamará a Dispose() en su objeto cuando se elimine por sí mismo.

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

Habiendo dicho lo que Rafa se hace evidente que a diferencia de Resolve()BuildUp() no soluciona el problema con la inyección de Héctor. Un escenario común es cuando creas tu objeto en algún lugar afuera, lo pasas como un parámetro y lo construyes dentro. (El exterior y el interior se relacionan con el cuerpo de un método). Además, es posible que deba llamar al Teardown() para limpiar el objeto y revertirlo al estado en que se encontraba antes de pasar como parámetro. Sin embargo, ten cuidado ya que Unity's built in Teardown() no hace nada, es una especie de marcador de posición adecuado para anular.

Un examen puede ser un objeto de impresora. Después de crear uno lo llama en una serie de otros métodos cada vez que inyecta un encabezado/pie de página diferente:

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