了解控制反转和依赖注入

本文关键字:依赖 注入 控制 了解 | 更新日期: 2023-09-27 18:35:04

我正在学习IoC和DI的概念。我查看了一些博客,以下是我的理解:

不使用 IoC 的紧密耦合示例:

Public Class A
{
     public A(int value1, int value2)
     {
    return Sum(value1, value2);
     }
     private int Sum(int a, int b)
     {
    return a+b;
     }
}     

在 IoC 之后:

Public Interface IOperation
{
    int Sum(int a, int b);
}
Public Class A
{ 
     private IOperation operation;
     public A(IOperation operation)
     {
    this.operation = operation;
     }
     public void PerformOperation(B b)
     {
    operation.Sum(b);
     }
}
Public Class B: IOperation
{
   public int Sum(int a, int b)
   {
       return a+b;
   }
}

类 A 中的 PerformOperation 方法错误。我想,它再次紧密耦合,因为参数被硬编码为 B b。

在上面的例子中,IoC 在哪里,因为我只能在类 A 的构造函数中看到依赖注入。

请清除我的理解。

了解控制反转和依赖注入

您的"IoC之后"示例实际上是"DI之后"。 您确实在 A 类中使用 DI。 但是,您似乎在 DI 之上实现适配器模式,这实际上不是必需的。 更不用说,你在打电话.当接口需要 2 个参数时,仅使用类 A 中的一个参数求和。

怎么样? 在依赖注入中有一个关于 DI 的快速介绍 - 简介

public interface IOperation
{
  int Sum(int a, int b);
}
private interface IInventoryQuery
{
  int GetInventoryCount();
}
// Dependency #1
public class DefaultOperation : IOperation
{
  public int Sum(int a, int b)
  {
    return (a + b);
  }
}
// Dependency #2
private class DefaultInventoryQuery : IInventoryQuery
{
  public int GetInventoryCount()
  {
    return 1;
  }
}

// Dependent class
public class ReceivingCalculator
{
  private readonly IOperation _operation;
  private readonly IInventoryQuery _inventoryQuery;
  public ReceivingCalculator(IOperation operation, IInventoryQuery inventoryQuery)
  {
    if (operation == null) throw new ArgumentNullException("operation");
    if (inventoryQuery == null) throw new ArgumentNullException("inventoryQuery");
    _operation = operation;
    _inventoryQuery = inventoryQuery;
  }
  public int UpdateInventoryOnHand(int receivedCount)
  {
    var onHand = _inventoryQuery.GetInventoryCount();
    var returnValue = _operation.Sum(onHand, receivedCount);
    return returnValue;
  }
}
// Application
static void Main()
{
  var operation = new DefaultOperation();
  var inventoryQuery = new DefaultInventoryQuery();
  var calculator = new ReceivingCalculator(operation, inventoryQuery);
  var receivedCount = 8;
  var newOnHandCount = calculator.UpdateInventoryOnHand(receivedCount);
  Console.WriteLine(receivedCount.ToString());
  Console.ReadLine();
}

简单来说,IOC是一个概念,DI是它的实现。

访问这篇文章了解更多细节,控制反转与依赖注入