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,那么你无论如何都不需要注入它。
存在三种面向对象的关系类型,即聚合、组合和关联,如下所述: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,那么你无论如何都不需要注入它。