我想从我的c#中运行一些节点代码。 Microsoft.AspNetCore.NodeServices
似乎是完成这项工作的方式,但是这些例子都非常相似,都涉及到
services.AddNodeServices();
在配置服务功能中然后DI将INodeServices的实现添加到控制器。喜欢这个
public class foo
{
private readonly INodeServices _nodeServices;
public foo(INodeServices nodeServices)
{
_nodeServices = nodeServices;
}
}
由于我在类库而不是webapi中使用它,DI如何工作?另外如何从单元测试中调用类,我可以将哪些内容传递给构造函数?我确定我错过了一些明显的东西。
答案 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)
参考文献: