Zastanawiam się, kiedy używam kompilacji i kiedy używam rozwiązania, używając Unity IOC.Unity IOC Buildup vs Resolve?
A kiedy mam zadzwonić pod teardown?
Dzięki
Zastanawiam się, kiedy używam kompilacji i kiedy używam rozwiązania, używając Unity IOC.Unity IOC Buildup vs Resolve?
A kiedy mam zadzwonić pod teardown?
Dzięki
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
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();
}
}