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

时间:2018-09-05 15:30:45

标签: c# asp.net-core dependency-injection asp.net-core-webapi

Asp.Net经验不足,我有一个我想能够在某些控制器上实例化和使用的类,而且我不确定如何将参数传递给构造函数。

我有一个数据类型,我想用作名为Watcher的服务,该数据类型的构造函数签名为Watcher(string _path, bool _DeletionPolicy = false),这提供了监视文件的路径,并设置了默认的删除策略。 (False是过期后不执行任何操作,文件在90天后“过期”。)

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

2 个答案:

答案 0 :(得分:2)

添加服务时使用工厂委托

例如

services.AddTransient<Watcher>(sp => new Watcher("some path here", otherVariable));

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

通过构造函数注入

private readonly Watcher watcher;

//ctor
public MyController(Watcher watcher) {
    this.watcher = watcher;
    //...
}

或直接在动作中

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

}

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

答案 1 :(得分:1)

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

编写实现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;
    }
}

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

services.AddTransient<IWatcher>(w => new Watcher("some path", deletionPolicy));

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

public class SomeController : Controller
{
    private readonly IWatcher _watcher;

    public SomeController(IWatcher watcher)
    {
        _watcher = watcher;
    }   
}