首页 > 解决方案 > 如何将服务注入.net核心中的静态方法

问题描述

我正在编写一个 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 方法中。然后我可以从任何地方调用它。想知道是否有更好的解决方案?

标签: c#dependency-injectionstatic.net-core-3.0asp.net-core-3.0

解决方案


我没有足够的声誉来写评论,否则我会询问更多细节,但我希望我仍然可以提供帮助。

如果您的帮助类已经演变成复杂到需要 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));

推荐阅读