如何在不依赖注入的情况下访问INodeServices

时间:2018-02-01 17:09:19

标签: c# dependency-injection asp.net-core

我想从我的c#中运行一些节点代码。 Microsoft.AspNetCore.NodeServices似乎是完成这项工作的方式,但是这些例子都非常相似,都涉及到

services.AddNodeServices();
在配置服务功能中

然后DI将INodeServices的实现添加到控制器。喜欢这个

public class foo  
{
    private readonly INodeServices _nodeServices;

    public foo(INodeServices nodeServices)
    {
        _nodeServices = nodeServices;
    }
}

由于我在类库而不是webapi中使用它,DI如何工作?另外如何从单元测试中调用类,我可以将哪些内容传递给构造函数?我确定我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:0)

DI的概念是它可用于解析对象图。也就是说,它不仅仅解决了Controller类的依赖关系,而是依赖于这些依赖关系,这些依赖关系的依赖关系等等。

要在自己的库中使用INodeServices,只需引用Microsoft.AspNetCore.NodeServices,然后将其作为构造函数参数接受。

public class MyServiceFromMyLibrary : IMyServiceFromMyLibrary
{
    private readonly INodeServices nodeServices;

    public MyServiceFromMyLibrary(INodeServices nodeServices)
    {
        this.nodeServices = nodeServices;
    }

    // ...
}

然后从Web API项目引用您的库并将您的服务注入控制器。

public class FooController  
{
    private readonly IMyServiceFromMyLibrary myService;

    public FooController(IMyServiceFromMyLibrary myService)
    {
        this.myService = myService;
    }
}

如果INodeServices实例已在composition root中注册,则会将services.AddNodeServices(); services.AddTransient<IMyServiceFromMyLibrary, MyServiceFromMyLibrary>(); 实例放入您的课程中,如下所示。

INodeServices

如果您的最终游戏是创建可重用库而不是应用程序层,请参阅DI Friendly Library了解一些使您的库更易于使用的技术< em>没有使用依赖注入。

  

另外如何从单元测试中调用类,我可以将哪些内容传递给构造函数?

对于单元测试,您只需要模拟var mock = new Mock<INodeServices>(); mock.Setup(ns => ns.InvokeAsync(It.IsAny<string>())).Returns(...); var target = new MyServiceFromMyLibrary(mock.Object); // .. Call a method on target and then assert the results 。最简单的方法是使用模拟库,例如Moq

parsed_sentences = HTMLSentenceTokenizer().feed(example_html_one)

参考文献: