C# 工作单元和存储库模式依赖项注入

C# 工作单元和存储库模式依赖项注入,c#,dependency-injection,C#,Dependency Injection,以下是我的IOOperation接口,它有两个签名: public interface IOperations { int Mul(int a, int b); int Sum(int a, int b); } 在操作类中,我实现了上述方法: public class Operations:IOperations { public int Mul(int a,int b) { return a * b; } public in

以下是我的IOOperation接口,它有两个签名:

public interface IOperations
{

    int Mul(int a, int b);
    int Sum(int a, int b);
}
在操作类中,我实现了上述方法:

public class Operations:IOperations
{
  public  int Mul(int a,int b)
    {


        return a * b;
    }

  public  int Sum(int a,int b)
    {


        return a + b;
    }
}
现在在主程序中,我应该如何满足DI?像这样

    static void Main(string[] args)
    {
        IOperations myOperations = new Operations();

        myOperations.Mul(3, 2);


    }

这是定义构造函数注入,这是最常见的DI模式。您基本上是说您的TestController需要一个实现IUnitOfWork的类才能正常工作。但是,您没有硬编码依赖项,而是指定TestController在创建时将通过一个IUnitOfWork实现。在依赖项注入框架的配置中,您将有如下内容:

Bind<IUnitOfWork >().To<UnitOfWorkImpl>();
Bind().To();

它指定了将被实例化的实际类。

与依赖项注入无关;什么是构造师

public class TestController
{
    private IUnitOfWork unitOfWork;

    public TestController(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }
}
它只是简单地获取一个
IUnitOfWork
对象的实例,并将其存储在它的字段
unitOfWork

因此,您可以(但不应该)这样称呼它:

// Returns an instance of IUnitOfWork.
IUnitOfWork mySpecificUnitOfWorkInstance = this.GetUnitOfWork();

// Now you pass that exact instance to the TestController so that it can do stuff with it.
TestController testController = new TestController(mySpecificUnitOfWorkInstance);

更简单的例子可能是(没有可能混淆的依赖注入、存储库模式等概念):

如果你这样称呼它

NumberHolder foo = new NumberHolder(42);
实际上,您将
42
传递给
NumberHolder
的新实例



进一步阅读:在docs.microsoft.com上。

我可以在这里再问一个关于DI的问题吗?@mrslt当然,走吧,我正在努力理解DI,我创建了一个小控制台项目,创建了一个接口IOperations,它有两个含义:int mul(int a,int b);整数和(整数a,整数b);我在Operations类中实现了这些方法,但是根据DI,我应该如何在主程序中使用它们来满足DIThere的要求,这里没有关于依赖项注入的任何需要记住的内容,因为这里没有依赖项。如果您要创建一个需要处理数学运算的
计算器
类,那么计算器应该只“知道”
IOperations
,而不是
operations
。这意味着构造函数的签名应该是这样的
公共计算器(IOperations operations)
,而不是
公共计算器(operations)
NumberHolder foo = new NumberHolder(42);