Asp.Net经验不足,我有一个我想能够在某些控制器上实例化和使用的类,而且我不确定如何将参数传递给构造函数。
我有一个数据类型,我想用作名为Watcher
的服务,该数据类型的构造函数签名为Watcher(string _path, bool _DeletionPolicy = false)
,这提供了监视文件的路径,并设置了默认的删除策略。 (False是过期后不执行任何操作,文件在90天后“过期”。)
我知道我需要在ConfigureServices()
中向MVC注册该服务,但是我将如何实例化这两个(或一个必需的)参数?
答案 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;
}
}