Имея то, что сказал Рафа, становится очевидным, что в отличие от Resolve()
BuildUp()
не помогает с впрыском ctor. Обычный сценарий - когда вы создаете свой объект где-то снаружи, передаете его как параметр и строите его внутри. (Снаружи и внутри относятся к телу метода.) Кроме того, вам может понадобиться вызвать Teardown()
, чтобы очистить объект и вернуть его в состояние, в котором он находился до передачи в качестве параметра. Однако остерегайтесь, поскольку встроенная в Unity Teardown()
ничего не делает, это своего рода заполнитель, подходящий для переопределения.
Экзамен может быть объектом принтера. После того, как вы его создадите, вы вызываете его рядом других методов, каждый раз вводя разные колонтитулы:
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();
}
}