Unity IOC Buildup vs Resolve? - PullRequest
       9

Unity IOC Buildup vs Resolve?

18 голосов
/ 12 января 2010

Мне было интересно, когда я использую наращивание и когда я использую разрешение, при использовании Unity IOC.

А когда я называю демонтаж?

Спасибо

Ответы [ 2 ]

22 голосов
/ 12 января 2010

Resolve используется, когда вы хотите, чтобы контейнер Unity создавал экземпляр (новый, когда он вам нужен, или уже существующий синглтон), вставлял его зависимости и передавал вам ссылку на объект.* BuildUp используется, когда у вас уже есть экземпляр объекта и вы хотите, чтобы контейнер просто разрешил и внедрил его зависимости.

Срыв - противоположность BuildUp.Вы можете передать свой объект в метод Teardown контейнера, чтобы закрыть / очистить / что угодно.Существующее поведение контейнера ничего не делает во время разрыва, но расширения могут быть написаны, чтобы воспользоваться этим.Вы также можете заставить свои объекты реализовывать IDisposable, и контейнер будет вызывать Dispose () для вашего объекта, когда он удаляется сам.

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
1 голос
/ 27 августа 2015

Имея то, что сказал Рафа, становится очевидным, что в отличие от 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();
    }
}
...