Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
C# 国际奥委会-控制在哪里;倒置;到(它去哪里?)_C#_.net_Oop_Dependency Injection_Inversion Of Control - Fatal编程技术网

C# 国际奥委会-控制在哪里;倒置;到(它去哪里?)

C# 国际奥委会-控制在哪里;倒置;到(它去哪里?),c#,.net,oop,dependency-injection,inversion-of-control,C#,.net,Oop,Dependency Injection,Inversion Of Control,基础理论问题警惕 这是关于国际奥委会的 我读到了有关国际奥委会的文章,意识到我对这个词的确切含义并不完全满意 然后,我找到了一个关于IoC的具体答案,这让我意识到,IoC不仅仅是关于类之间的控制/依赖关系,它是一个更一般的术语: 由用户控制输入数据的顺序,而不是由计算机按固定顺序接受用户输入 有趣。现在我对这个词感到舒服多了 然后我在阅读,我对它感到很舒服,一直在实施,知道它的好处等等 但是,在下面的场景中,从图1到图2,我们将控制OrderService。OrderServices现在只知道一

基础理论问题警惕

这是关于国际奥委会的

我读到了有关国际奥委会的文章,意识到我对这个词的确切含义并不完全满意

然后,我找到了一个关于IoC的具体答案,这让我意识到,IoC不仅仅是关于类之间的控制/依赖关系,它是一个更一般的术语:

由用户控制输入数据的顺序,而不是由计算机按固定顺序接受用户输入

有趣。现在我对这个词感到舒服多了

然后我在阅读,我对它感到很舒服,一直在实施,知道它的好处等等

但是,在下面的场景中,从图1到图2,我们将控制OrderService。OrderServices现在只知道一个抽象,太好了。很多好处。

编辑:上面图1中的代码(来自文章)是:

public class OrderService
{
    public void AcceptOrder(Order order)
    {
        new OrderDatabase().SaveOrder(order);
    }
}
然后,在图2中实现IoC和DI之后,代码是:

public class OrderService
{
    private IOrderSaver orderSaver;

    public OrderService(IOrderSaver orderSaver)
    {
        this.orderSaver = orderSaver;
    }

    public void AcceptOrder(Order order)
    {
        orderSaver.SaveOrder(order);
    }
}
我的问题是,控制被认为已经到哪里去了

是否考虑将控制权转移至:

1-接口?(我觉得这不太可能)

2-用于在运行时连接DI的IOC容器?(我的感觉是这是一个可能)

3-或OrderDatabase(我觉得这是最可能的答案)


SO-控制权在哪里被倒置?

参考以下代码

public class OrderService {
    public void AcceptOrder(Order order) {

        //...Domain logic such as validation

        //then save order
        new OrderDatabase().SaveOrder(order);
    }
}
OrderService
不应负责创建
OrderDatabase
,这违反了单一责任原则(SRP)。它与实现关注点紧密耦合,这违反了关注点分离(SoC)

通过反转
OrderService
在创建依赖项时所具有的控制, 它明确地依赖于重构版本中所需功能的抽象

public class OrderService {
    private readonly IOrderSaver orderSaver;

    public OrderService(IOrderSaver orderSaver) {
        this.orderSaver = orderSaver;
    }

    public void AcceptOrder(Order order) {

        //...Domain logic such as validation

        //then save order
        orderSaver.SaveOrder(order);
    }
}
将创建依赖关系的控制权委托/转换给
OrderService
的消费者(谁负责创建和使用
OrderService

可以是DI/IoC容器,也可以是via(没有DI容器的依赖项注入)


无论是通过容器还是纯DI进行DI都无关紧要,因为它们将被视为实现细节,而这与目标类无关,在本例中,
OrderService

谢谢。我一直在寻找的关键信息是这样提供的:“将创建依赖关系的控制权委托/转换给OrderService的消费者(负责创建和使用OrderService的人),它可以是DI/IoC容器,也可以通过纯DI”@fourbeatcoder希望这能消除你之前的困惑。