非常缺乏Asp.Net,我有一个类,我希望能够在一些控制器中实例化和使用,我不确定如何获取我的构造函数的参数。
我有一个数据类型,我想将其用作名为Watcher
的服务,它具有Watcher(string _path, bool _DeletionPolicy = false)
的构造函数签名,这提供了一个监视文件的路径,并设置了默认的删除策略。 (False在到期后无效,文件在90天后“过期”。)
我知道我需要在ConfigureServices()
中使用MVC注册服务,但是我将如何实例化这两个(或一个必需的)参数?
简而言之,你将不得不做这样的事情:
编写实现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;
}
}
添加服务时使用工厂代理
例如
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) {
}
在激活注入类时,容器将使用该委托。