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