gpt4 book ai didi

c# - 了解控制反转和依赖注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:03 24 4
gpt4 key购买 nike

我正在学习 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 的构造函数中看到依赖注入(inject)。

请澄清我的理解。

最佳答案

您的“IoC 之后”示例实际上是“DI 之后”。您确实在 A 类中使用了 DI。但是,您似乎在 DI 之上实现了一个适配器模式,这实际上是没有必要的。更不用说,当接口(interface)需要 2 个参数时,您仅使用类 A 的一个参数调用 .Sum。

这个怎么样?在 Dependency Injection - Introduction 有一个 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();
}

关于c# - 了解控制反转和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com