根据 SOLID 原则,一个类不能依赖其他类,必须注入依赖项。这很简单:
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
但是,如果我希望我的 Foo 类能够创建 Bar,而不知道 IBar 背后的确切实现,该怎么办?我可以在这里想到 4 种解决方案,但它们似乎都有缺点:
- 注入对象的类型并使用反射
- 使用泛型
- 使用“服务定位器”并调用 Resolve() 方法。
- 创建一个分离的工厂类并将其注入 Foo:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
最后一种情况看起来很自然,但是 BarCreator 类的代码太少了。那你怎么看,哪个最好?