如何将服务注入.net核心中的静态方法



我正在编写一个html助手,它将为我做一些计算。现在,因为它是一个助手,所以它是一种静态方法。例如:

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

我面临的问题是,我从cshtml文件中调用它,我需要以某种方式计算该方法中的文件版本。通常,我可以用<asp-apend-verion="true">在html中调用它,但因为我在这里返回了一个字符串,所以如果我只是键入它,它就不起作用。

根据我所做的研究,我发现我可以用IFileVersionProvider.AddFileVersionToPath做同样的事情,但我不知道如何注入它,所以我可以在该方法中使用它。

编辑:

我想我可能需要提供更清晰的图片。从本质上讲,我试图让它在调试代码时,我的javascript文件会给我文件的完整版本,而在生产中,它们会给我缩小的版本。因此,我有一个我在网上找到的助手类的修改版本https://gist.github.com/mohamedmansour/cd50123f8575daba7a7f12847b12da5d我的代码有点不同,因为我想要一些其他的东西。其中一件事是我仍然希望附加文件版本。所以我本质上是从HTML文件中调用它。如果我只是添加<asp-append-verion="true">,那么它就不起作用,因为它被解析为字符串。因此,在返回该字符串之前,我需要附加verison。我发现我可以通过IFileVersionProvider做到这一点,但我需要该方法的实现才能使用它。这是我唯一的瓶颈。

编辑2:

我目前的解决方案是在启动类中创建一个静态属性,然后将其注入Configure方法中。然后我可以在任何地方叫它。想知道是否有更好的解决方案?

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

如果您的助手类已经发展到需要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));

最新更新