unitycontainer unity registertypes registertype iunitycontainer container .net unity-container ioc-container

.net - registertypes - unity container resolve



¿Unity IOC Buildup vs Resolve? (2)

Me preguntaba cuándo uso la acumulación y cuándo uso la resolución, cuando uso el IOC de Unity.

¿Y cuándo llamo demolición?

Gracias


Resolve se usa cuando desea que el contenedor de Unity construya la instancia (una nueva justo cuando la necesite o un singleton preexistente), inyecte sus dependencias y le entregue la referencia al objeto.

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

Desmontaje es lo contrario de BuildUp. Puede pasar su objeto al método Teardown del contenedor para apagar / limpiar / lo que quiera. El comportamiento del contenedor existente no hace nada en el momento del desmontaje, pero se pueden escribir extensiones para aprovechar esto. También puede hacer que sus objetos se implementen como IDisponibles, y el contenedor llamará a Dispose () en su objeto cuando se elimine él 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


Teniendo lo que Rafa dijo, se hace evidente que a diferencia de Resolve() BuildUp() no ayuda con la inyección de ctor. Un escenario común es cuando creas tu objeto en algún lugar afuera, pásalo como parámetro y constrúyelo dentro. (El exterior y el interior se relacionan con el cuerpo de un método). Además, es posible que deba llamar a Teardown() para limpiar el objeto y revertirlo al estado en el que estaba antes de pasar como parámetro. Sin embargo, Teardown() cuidado, ya que el hecho de que Unity haya construido en Teardown() no hace nada, es una especie de marcador de posición adecuado para anular.

Un ejemplo puede ser un objeto de impresora. Después de crear uno, lo convoca con otros métodos cada vez que inyecte 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(); } }