我想从我的c#中运行一些节点代码。Microsoft.AspNetCore.NodeServices似乎是完成这项工作的方法,但是这些例子都是非常相似的,都涉及到
services.AddNodeServices();在配置服务函数中,然后DI将INodeServices的实现添加到控制器中。像这样
public class foo
{
private readonly INodeServices _nodeServices;
public foo(INodeServices nodeServices)
{
_nodeServices = nodeServices;
}
}当我在类库而不是webapi中使用这个时,DI是如何工作的?此外,如何从单元测试中调用类,可以传递给构造函数什么?我肯定我漏掉了一些显而易见的东西。
发布于 2018-02-01 17:36:50
DI的概念是它可以用来解析对象图。也就是说,它不仅解决了Controller类的依赖关系,还解析了这些依赖项的依赖项、这些依赖项的依赖项等等。
要在自己的库中使用INodeServices,只需引用Microsoft.AspNetCore.NodeServices,然后接受它作为构造函数参数。
public class MyServiceFromMyLibrary : IMyServiceFromMyLibrary
{
private readonly INodeServices nodeServices;
public MyServiceFromMyLibrary(INodeServices nodeServices)
{
this.nodeServices = nodeServices;
}
// ...
}然后从Web项目中引用您的库,并将您的服务注入控制器。
public class FooController
{
private readonly IMyServiceFromMyLibrary myService;
public FooController(IMyServiceFromMyLibrary myService)
{
this.myService = myService;
}
}DI负责将INodeServices实例放入您的类中,前提是它在复合根中注册,如下所示。
services.AddNodeServices();
services.AddTransient<IMyServiceFromMyLibrary, MyServiceFromMyLibrary>();如果您的最终目的是创建一个可重用的库,而不是一个应用层,请参考第二友好图书馆获得一些技术,以使您的库在不使用依赖注入的情况下更容易使用。
此外,如何从单元测试中调用类,可以传递给构造函数什么?
对于单元测试,只需模拟INodeServices即可。最简单的方法是使用一个模拟库,比如Moq。
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参考文献:
https://stackoverflow.com/questions/48568205
复制相似问题