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



有三种面向对象的关系类型,即聚合,组合和关联,如下所述:关联,聚合和组合有什么区别?

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

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

我相信上面的代码是聚合的一个例子,因为MyClass不负责MyClass2的生命周期。

下面是一个关联示例,即 MyClass2 被传递给方法(而不是注入到类中):

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

我可以为合成做这样的事情:

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

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

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

您可能会稍微偏离的一件事是 IoC 的注入方式。IoC 可以执行构造函数、属性和方法注入,因此关联示例仍然可以是依赖项注入。

如果对象不提供任何实际逻辑,则没有 IoC 的组合是可以的。如果你想在类中编写的内容只是一个DTO,那么你无论如何都不需要注入它。

最新更新