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

C# 如何在没有依赖注入的情况下访问INodeServices,c#,dependency-injection,asp.net-core,C#,Dependency Injection,Asp.net Core,我想从我的c#运行一些节点代码Microsoft.AspNetCore.NodeServices似乎是完成这项工作的方法,但是示例都非常相似,都涉及到 services.AddNodeServices(); 在configure services函数中,然后DI将INodeServices的实现添加到控制器中。像这样 public class foo { private readonly INodeServices _nodeServices; public foo(IN

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

services.AddNodeServices();
在configure services函数中,然后DI将INodeServices的实现添加到控制器中。像这样

public class foo  
{
    private readonly INodeServices _nodeServices;

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

当我在类库中而不是在webapi中使用它时,DI将如何工作?还有,我如何从单元测试调用该类,我可以向构造函数传递什么?我确信我遗漏了一些明显的东西。

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

要在自己的库中使用
INodeServices
,只需引用,然后将其作为构造函数参数接受即可

public class MyServiceFromMyLibrary : IMyServiceFromMyLibrary
{
    private readonly INodeServices nodeServices;

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

    // ...
}
然后从WebAPI项目中引用您的库,并将您的服务注入控制器

public class FooController  
{
    private readonly IMyServiceFromMyLibrary myService;

    public FooController(IMyServiceFromMyLibrary myService)
    {
        this.myService = myService;
    }
}
DI负责将
INodeServices
实例放入您的类中,前提是它已在您的中注册,如下所示

services.AddNodeServices();
services.AddTransient<IMyServiceFromMyLibrary, MyServiceFromMyLibrary>();
参考资料:


ASP.NET Core中内置的DI容器不是ASP.NET Core的一部分。您可以通过引用NuGet软件包Microsoft.Extensions.DependencyInjection来使用它。您可以自己构建对象图并构建服务提供商。参考前面评论中建议的库,并查看此网站,了解如何在asp.net-core之外的应用程序中使用它的示例。此处有非常有用的文章您好,谢谢您的回答,但这对我没有帮助,隐藏DI的技术围绕着更新INodeServices展开。你知道构造函数是什么吗?我想我指的是集成测试,而不是严格的单元测试,因为我想测试节点服务的功能,而不是模拟它。因为.NET Core是开源的,这很容易确定-看起来您应该能够使用。然而,它的依赖性
NodeServicesOptions
依赖于
IServiceFactory
(使其成为服务定位器),而且它似乎还依赖于其他一些东西。底线是单元测试是简单的,但集成测试并不多。看见
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