c# - 如何将服务注入.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 方法中。然后我可以从任何地方调用它。想知道是否有更好的解决方案?
解决方案
我没有足够的声誉来写评论,否则我会询问更多细节,但我希望我仍然可以提供帮助。
如果您的帮助类已经演变成复杂到需要 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));
推荐阅读
- rundeck - Rundeck用户切换用户失败
- python - 在 django 中运行多个异步任务并等待它们全部完成,
- javascript - 使用 Yubikey 的 WebAuthn 身份验证 API 异常
- javascript - 从内容脚本访问 .env 文件
- primefaces - Primefaces 展示自动完成 countryService @inject 问题(Primefaces 8.0、JSF 2.3、TomEE-wepprofile)
- flutter - Flutter 初始状态 Cubit
- angular - 角材料垫菜单无法设置内部垫形式字段的样式
- c++ - 安全地将 int 重构为数组
- react-native - 全局安装 react-native 后,仍无法识别 react-native 命令
- java - WebServiceException:javax.net.ssl.SSLException:java.net.SocketException:连接重置