Подтвердить что ты не робот

Unity IOC Buildup vs Resolve?

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

А когда я могу вызвать teardown?

Спасибо

4b9b3361

Ответ 1

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

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

Teardown - это противоположность BuildUp. Вы можете передать свой объект методу Teardown контейнера, чтобы выключить/очистить/все, что вам нужно. Существующее поведение контейнера ничего не делает во время 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

Ответ 2

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