IOC 容器是否支持不使用服务定位器模式的组合?

Do IOC containers support composition without using the service locator pattern?

存在三种面向对象的关系类型,即聚合、组合和关联,如下所述:What is the difference between association, aggregation and composition?

IOC 通过允许您执行此操作来支持组合:

public class MyClass
{

MyClass2 MyClass2;

public MyClass(MyClass2 myClass2)
{
  MyClass2 = myClass2;
}
}

我认为上面的代码是聚合的示例,因为 MyClass 不负责 MyClass2 的生命周期。

这是关联的示例,即 MyClass2 被传递给方法(而不是被注入到 class):

public void MyMethod(MyClass2 myClass2)
{
   //Do something
}

我可以为 Composition 做这样的事情:

public class MyClass
{

WindsorContainer Container;

    MyClass2 MyClass2;

    public MyClass(WindsorContainer container)
    {
      Container=container;
      MyClass2 = Container.Resolve<MyClass2>();
    }
    }

但是,我相信组合示例使用了服务定位器反模式。如何在不使用服务定位器模式的情况下使用组合?

如果您发现自己在使用服务定位器模式,那么质疑它是正确的,但它有它的用武之地,并且可以在需要时使用。

您可能不太了解 IoC 注入的方式。 IoC 可以做构造函数,属性 和方法注入,所以你的关联示例仍然可以是依赖注入。

如果对象不提供任何真正的逻辑,那么没有 IoC 的组合是可以的。如果你想要组合到你的 class 中的只是一个 DTO,那么你无论如何都不需要注入它。