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

问题描述 投票:1回答:2

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

我有一个数据类型,我想将其用作名为Watcher的服务,它具有Watcher(string _path, bool _DeletionPolicy = false)的构造函数签名,这提供了一个监视文件的路径,并设置了默认的删除策略。 (False在到期后无效,文件在90天后“过期”。)

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

c# asp.net-core dependency-injection asp.net-core-webapi
2个回答
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;
    }   
}   

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) {

}

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

© www.soinside.com 2019 - 2024. All rights reserved.