首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有依赖项注入的情况下访问INodeServices

如何在没有依赖项注入的情况下访问INodeServices
EN

Stack Overflow用户
提问于 2018-02-01 17:09:19
回答 1查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
services.AddNodeServices();

在配置服务函数中,然后DI将INodeServices的实现添加到控制器中。像这样

代码语言:javascript
复制
public class foo  
{
    private readonly INodeServices _nodeServices;

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

当我在类库而不是webapi中使用这个时,DI是如何工作的?此外,如何从单元测试中调用类,可以传递给构造函数什么?我肯定我漏掉了一些显而易见的东西。

EN

回答 1

Stack Overflow用户

发布于 2018-02-01 17:36:50

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

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

代码语言:javascript
复制
public class MyServiceFromMyLibrary : IMyServiceFromMyLibrary
{
    private readonly INodeServices nodeServices;

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

    // ...
}

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

代码语言:javascript
复制
public class FooController  
{
    private readonly IMyServiceFromMyLibrary myService;

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

DI负责将INodeServices实例放入您的类中,前提是它在复合根中注册,如下所示。

代码语言:javascript
复制
services.AddNodeServices();
services.AddTransient<IMyServiceFromMyLibrary, MyServiceFromMyLibrary>();

如果您的最终目的是创建一个可重用的库,而不是一个应用层,请参考第二友好图书馆获得一些技术,以使您的库在不使用依赖注入的情况下更容易使用。

此外,如何从单元测试中调用类,可以传递给构造函数什么?

对于单元测试,只需模拟INodeServices即可。最简单的方法是使用一个模拟库,比如Moq

代码语言:javascript
复制
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

参考文献:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48568205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档