.net 团结还是决心?

.net 团结还是决心?,.net,unity-container,ioc-container,.net,Unity Container,Ioc Container,我想知道我什么时候用积木,什么时候用决心,什么时候用团结 我什么时候叫拆卸 感谢当您希望Unity容器构造实例(在您需要时创建一个新实例或一个预先存在的单例实例)时,使用Resolve,注入其依赖项并将对象的引用交给您 当您已经有了对象的实例,并且希望容器只解析和注入其依赖项时,可以使用构建 拆卸与堆积相反。您可以将对象传递给容器的Teardown方法,以关闭/清理/任何您想要的内容。现有的容器行为在拆卸时不起任何作用,但是可以编写扩展来利用这一点。您还可以使对象实现IDisposable,当对

我想知道我什么时候用积木,什么时候用决心,什么时候用团结

我什么时候叫拆卸


感谢

当您希望Unity容器构造实例(在您需要时创建一个新实例或一个预先存在的单例实例)时,使用Resolve,注入其依赖项并将对象的引用交给您

当您已经有了对象的实例,并且希望容器只解析和注入其依赖项时,可以使用构建

拆卸与堆积相反。您可以将对象传递给容器的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
IMyService service=container.Resolve();//新服务或预先存在的单例
IMyService service=GetMyService();//从某个源获取实例
容器。堆积物(服务);//注入依赖项
容器。拆卸(服务);//清理

听了拉法的话,很明显,与
Resolve()
building()
不同的是,它对注射没有帮助。一种常见的情况是,当您在外部某处创建对象时,将其作为参数传递并在内部构建。(外部和内部与方法体有关。)此外,您可能需要调用
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();
    }
}