我一直在互联网上寻找一段时间,但找不到确切的答案。好吧,他们说向类中注入抽象(接口或东西),而不是让它创建它需要的实例,或者不是传递实现类型。
class Foo
{
private IBar _bar;
public Foo(Ibar bar)
{
_bar = bar;
}
}
虽然我不完全理解上面是如何合理地松散耦合,但我现在的问题是关于其他事情。也就是说,如果方法必须返回某个实例,该怎么办?例如,如何使松散耦合:
class Foo
{
public IBar GetMeSomething()
{
return new Bar(); // dependency here
}
}
我只是想知道如何解决上面对Bar的依赖?任何有经验的程序员请帮助我理解这一点。或者有人可能会建议一些文章全面讨论消除/减少类型相互依赖性的所有这些场景。
答案 0 :(得分:1)
当一个类需要知道关于你的程序的“Something”时,你可以通过在构造函数中传递另一个类的实例来解决这个问题。
如果在构造函数中只接受接口而不是具体类,那么稍后您就可以轻松地更改实现。
如果你必须在运行时创建对象,你需要工厂,你的类Foo就是你的IBarFactory(因为它实例化了IBars)。
通过接口的构造函数中的依赖关系很容易通过任何IoC框架解决(工厂也在构造函数中传递),而工厂本身的实现允许直接或通过IoC框架实例化对象,因为这是类的责任。
使用IoC容器和依赖注入并不会使魔术发生偶然耦合,你仍然需要考虑使用SOLID原则的类,但是当使用SOLID原则时,IoC容器和DI会有很大的帮助。