Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 对象的松耦合和返回_Dependency Injection_Inversion Of Control_Loose Coupling - Fatal编程技术网

Dependency injection 对象的松耦合和返回

Dependency injection 对象的松耦合和返回,dependency-injection,inversion-of-control,loose-coupling,Dependency Injection,Inversion Of Control,Loose Coupling,我已经在互联网上寻找了一段时间,但没有找到确切的答案。好的,他们说将抽象(接口或其他东西)注入到类中,而不是让它创建所需的实例,或者传递实现类型 class Foo { private IBar _bar; public Foo(Ibar bar) { _bar = bar; } } 虽然我不完全理解上面的内容是如何合理地松散耦合的,但我现在的问题是关于其他方面的。也就是说,如果一个方法必须返回某个对象的实例,该怎么办。例如,如何使以下内容松散

我已经在互联网上寻找了一段时间,但没有找到确切的答案。好的,他们说将抽象(接口或其他东西)注入到类中,而不是让它创建所需的实例,或者传递实现类型

class Foo
{
    private IBar _bar;

    public Foo(Ibar bar)
    {
        _bar = bar;
    }
}
虽然我不完全理解上面的内容是如何合理地松散耦合的,但我现在的问题是关于其他方面的。也就是说,如果一个方法必须返回某个对象的实例,该怎么办。例如,如何使以下内容松散耦合:

class Foo
{
    public IBar GetMeSomething()
    {
         return new Bar(); // dependency here
    }
}
我只是想知道如何解决上面对Bar的依赖?任何有经验的程序员请帮助我理解这一点。或者有人可以推荐一些文章,全面讨论消除/减少类型间依赖性的所有此类场景。

当一个类需要了解有关程序的“某些信息”时,可以通过在构造函数中传递另一个类的实例来解决

如果您只接受构造函数中的接口,而不接受具体的类,那么以后就可以轻松地更改实现

如果您必须在运行时创建对象,您需要工厂,那么在您的例子中,类Foo是一个IBarFactory(因为它实例化了ibar)

通过接口在构造函数中的依赖关系很容易由任何IoC框架解决(工厂也在构造函数中传递),而工厂本身的实现允许直接或通过IoC框架实例化对象,因为这是类的责任

使用IoC容器和依赖项注入并不会使LooScoppling发生在magic中,您仍然需要使用坚实的原则建模类,但是当使用坚实的原则时,IoC容器和DI会有很大的帮助