在 ASP.net Core 中将对象实例化为服务

Chr*_*ord 4 c# dependency-injection asp.net-core asp.net-core-webapi

对 Asp.Net 非常缺乏经验,我有一个类,我希望能够在某些控制器中实例化和使用该类,但我不确定如何为我的构造函数获取参数。

我有一个数据类型,我想将它用作一个名为的服务Watcher,它有一个构造函数签名,Watcher(string _path, bool _DeletionPolicy = false)它提供了一个观看文件的路径,并设置了默认的删除策略。(错误是过期后什么都不做,文件在 90 天后“过期”。)

我知道我需要在 MVC 中注册服务ConfigureServices(),但是我将如何实例化这两个(或一个必需的)参数?

Nko*_*osi 5

添加服务时使用工厂委托

例如

services.AddTransient<Watcher>(sp => new Watcher("some path here", otherVariable));
Run Code Online (Sandbox Code Playgroud)

从那里使用服务作为依赖项时,

通过构造函数注入

private readonly Watcher watcher;

//ctor
public MyController(Watcher watcher) {
    this.watcher = watcher;
    //...
}
Run Code Online (Sandbox Code Playgroud)

或直接在一个动作中

public IActionResult MyAction(int arg, [FromServices]Watcher watcher) {

}
Run Code Online (Sandbox Code Playgroud)

当激活类进行注入时,容器将使用该委托。


jur*_*rin 5

简而言之,您必须执行以下操作:

编写实现 IWatcher 接口的 Watcher 类:

public class Watcher : IWatcher
{
    private readonly string _path;
    private readonly bool _deletionPolicy;

    public Watcher(string path, bool deletionPolicy = false)
    {
        _path = path;
        _deletionPolicy = deletionPolicy;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 Startup.cs 的 ConfigureServices 方法中将 IWatcher 注册到 Watcher 类,如下所示:

services.AddTransient<IWatcher>(w => new Watcher("some path", deletionPolicy));
Run Code Online (Sandbox Code Playgroud)

最后,在需要 Watcher 类的每个控制器中,在构造函数中使用 IWatcher 接口。当您将 IWatcher 添加到控制器构造函数时,依赖项注入将实例化您在 ConfigureServices 方法中定义的 Watcher。之后它会将其注入构造函数并将其分配给一个私有变量。然后,您可以在需要的方法中在控制器中使用它。

public class SomeController : Controller
{
    private readonly IWatcher _watcher;

    public SomeController(IWatcher watcher)
    {
        _watcher = watcher;
    }   
}   
Run Code Online (Sandbox Code Playgroud)