使用 IoC 容器时的解释 "Dependency Injection vs Service Location"
Explain "Dependency Injection vs Service Location" when using IoC containers
在Jason's answer to Dependency Injection vs Service Location中:
Right:
public Foo(Bar bar)
{
this.bar = bar;
}
下面这句话正确吗?
使用 IoC 框架作为 StructureMap 或 Unity 的意义在于,我们可以做到
依赖注入
public Foo(container->GetInstance(IBar))
{
this.bar = bar;
}
哪个比做的更好:
服务定位器
public Foo(Container container)
{
this.bar = container->GetInstance(IBar);
}
依赖注入的重点在于你可以做到
public Foo(IBar bar)
{
this.bar = bar;
}
并将 class Foo
与 Bar
class 分离。然后使用 StructureMap、Unity 或 20 多个依赖注入容器中的任何其他容器来配置要为每个合约使用哪个 class 或实例(=接口,可选加上名称)并让 DI 容器解析所有依赖项.
你这样做是因为它允许你通过模拟它的依赖关系来有效地对你的 class Foo
进行单元测试。您通常不会自己显式注入依赖项。
在我看来,依赖注入通常效果最好,如果你只将它用作一次性的东西。也就是说,您在应用程序开始时解析您的主要应用程序服务,包括其所有依赖项,然后在应用程序 运行.
时使用初始化的服务对象网络
您避免使用服务定位器(这是您的第二个代码示例),因为 1. 它将您绑定到特定的 DI 容器,并且 2. 您隐藏了对 IBar
的依赖性。
在Jason's answer to Dependency Injection vs Service Location中:
Right:
public Foo(Bar bar) { this.bar = bar; }
下面这句话正确吗?
使用 IoC 框架作为 StructureMap 或 Unity 的意义在于,我们可以做到
依赖注入
public Foo(container->GetInstance(IBar)) { this.bar = bar; }
哪个比做的更好:
服务定位器
public Foo(Container container) { this.bar = container->GetInstance(IBar); }
依赖注入的重点在于你可以做到
public Foo(IBar bar)
{
this.bar = bar;
}
并将 class Foo
与 Bar
class 分离。然后使用 StructureMap、Unity 或 20 多个依赖注入容器中的任何其他容器来配置要为每个合约使用哪个 class 或实例(=接口,可选加上名称)并让 DI 容器解析所有依赖项.
你这样做是因为它允许你通过模拟它的依赖关系来有效地对你的 class Foo
进行单元测试。您通常不会自己显式注入依赖项。
在我看来,依赖注入通常效果最好,如果你只将它用作一次性的东西。也就是说,您在应用程序开始时解析您的主要应用程序服务,包括其所有依赖项,然后在应用程序 运行.
时使用初始化的服务对象网络您避免使用服务定位器(这是您的第二个代码示例),因为 1. 它将您绑定到特定的 DI 容器,并且 2. 您隐藏了对 IBar
的依赖性。