Как я могу внедрить службу в статический метод в ядре .net - PullRequest
0 голосов
/ 31 октября 2019

Я пишу HTML-помощник, который будет делать некоторые расчеты для меня. Теперь, потому что это помощник, это статический метод. Например:

public class MyHelper
{
    public static HtmlString DoSomething()
    {
        //do some action and return;
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что я вызываю это из файла cshtml, мне нужно каким-то образом вычислить версию файла внутри этого метода. Обычно я могу вызвать это в html с помощью <asp-apend-verion="true">, но, поскольку я возвращаю строку здесь, она не работает, если я просто набираю ее.

На основании проведенного исследования я обнаружил, чтоможно сделать то же самое с IFileVersionProvider.AddFileVersionToPath, однако я не могу понять, как его ввести, чтобы использовать его в этом методе.

Редактировать:

Я думаю, что мне может понадобитьсяобеспечить более четкое представление о картине. По сути, я пытаюсь сделать так, чтобы при отладке кода мои файлы javascript давали мне полные версии файла, а в процессе производства - уменьшенные версии. Таким образом, у меня есть измененная версия вспомогательного класса, которую я нашел в Интернете https://gist.github.com/mohamedmansour/cd50123f8575daba7a7f12847b12da5d, чтобы сделать это для меня. Мой код немного отличается, так как я хочу некоторые другие вещи. Одна из тех вещей, я хочу добавить версию файла. Поэтому я по сути называю это из файла HTML. Если я просто добавлю <asp-append-verion="true">, то это не сработает, так как это анализируется как строка. Поэтому мне нужно добавить версию, прежде чем я верну эту строку. Я обнаружил, что могу сделать это через IFileVersionProvider, но мне нужна реализация этого метода для его использования. Это мое единственное узкое место.

Редактировать 2:

Мое текущее решение - создать статическое свойство в классе запуска и затем внедрить его в метод Configure. Тогда я могу позвонить откуда угодно. Хотите знать, есть ли лучшее решение?

1 Ответ

1 голос
/ 31 октября 2019

У меня недостаточно репутации, чтобы написать комментарий, иначе я бы попросил более подробную информацию, но я надеюсь, что смогу помочь.

Если ваш вспомогательный класс превратился в нечто достаточно сложное, чтобы требоватьDI, тогда, вероятно, статический метод не подходит. Я обычно пишу статические методы для функций, которые не зависят от состояния, то есть чистые функции, такие как Math.Sqrt. Если у вашего метода есть зависимость от класса, то я бы преобразовал его в метод экземпляра и внедрил бы его в его потребителей.

Сказал, что, если вы все еще хотите использовать статический класс, вы можете внедрить зависимостьв статический метод:

public class MyHelper
{
    public static HtmlString DoSomething(IFileVersionProvider provider, int otherParameter)
    {
        //do some action and return;
    }
}

Если вы не хотите внедрять IFileVersionProvider в потребительский класс, вы можете сделать что-то вроде:

public class Consumer
{
    private readonly Func<int, HtmlString> doSomething;

    public Consumer(Func<int, HtmlString> doSomething)
    {
        this.doSomething = doSomething;
    }
}

// somewhere in the IoC container configuration
services.AddSingleton<Consumer>(
    s => new Consumer(p => MyHelper.DoSomething(s.GetService<IFileVersionProvider>(), p));
...