【问题标题】:How can I inject a service into a static method in .net core如何将服务注入.net核心中的静态方法
【发布时间】:2019-11-01 04:50:34
【问题描述】:

我正在编写一个 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"> 则它不起作用,因为它被解析为字符串。所以我需要在返回该字符串之前附加版本。我发现我可以通过 IFileVersionProvider 做到这一点,但我需要实现该方法才能使用它。这是我唯一的瓶颈。

编辑 2:

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 这很好,但是方法调用看起来会怎样,因为通常,在调用方法时需要发送一些东西作为参数,在我们的例子中是 DoSomething 方法。我的意思是你会这样称呼它:DoSomething(otherParameter),但是第一个参数会发生吗?
  • 方法调用看起来像doSomething(parm)。另一个参数是 IoC 容器注入构造函数的闭包的一部分。
猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 2020-01-17
  • 2015-06-08
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多