Создание объекта как службы в ASP.net Core - PullRequest
0 голосов
/ 05 сентября 2018

Очень неопытен с Asp.Net, и у меня есть класс, который я хочу иметь возможность создавать и использовать на некоторых контроллерах, и я не совсем уверен, как получить аргументы для моего конструктора.

У меня есть тип данных, который я хотел бы использовать в качестве службы с именем Watcher, с сигнатурой конструктора Watcher(string _path, bool _DeletionPolicy = false), которая обеспечивает путь для просмотра файлов и устанавливает политику удаления по умолчанию. (Ложь - ничего не делать после истечения срока, файл «истекает» через 90 дней.)

Я понимаю, что мне нужно зарегистрировать службу в MVC в ConfigureServices(), но как мне создать экземпляр этих двух (или одного обязательного) параметра?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018
Вкратце

вам нужно будет сделать что-то вроде этого:

Напишите ваш класс Watcher, который реализует интерфейс IWatcher:

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

    public Watcher(string path, bool deletionPolicy = false)
    {
        _path = path;
        _deletionPolicy = deletionPolicy;
    }
}

затем в методе ConfigureServices в Startup.cs зарегистрируйте IWatcher в классе Watcher следующим образом:

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

Наконец, в каждом контроллере, где вам нужен класс Watcher, используйте интерфейс IWatcher в конструкторе. Когда вы добавляете IWatcher в конструктор контроллера, внедрение зависимости будет создавать экземпляр Watcher, как вы его определили в методе ConfigureServices. После этого он вставит его в конструктор и присвоит его закрытой переменной. Затем вы можете использовать его в контроллере методами, где это необходимо.

public class SomeController : Controller
{
    private readonly IWatcher _watcher;

    public SomeController(IWatcher watcher)
    {
        _watcher = watcher;
    }   
}   
0 голосов
/ 05 сентября 2018

Использовать фабричный делегат при добавлении услуги

Например

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

}

контейнер будет использовать этот делегат при активации класса для внедрения.

...