从静态类访问 DI 服务

时间:2020-12-23 17:53:06

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

现在 ElementReference 上有一个扩展方法,用于将焦点从 razor 组件设置到该元素。太好了。

但是……

我在 DI 中使用 SelectAll 等方法创建了一个 JSInteropService:

public class JSInteropService : IAsyncDisposable
{
    private readonly Lazy<Task<IJSObjectReference>> moduleTask;

    public JSInteropService(IJSRuntime jsRuntime)
    {
        moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
            "import", "./_content/MyComponentClassLib/mycomponents.js").AsTask());
    }


    public async ValueTask SelectAll(ElementReference elementReference)
    {
        var module = await moduleTask.Value;
        await module.InvokeVoidAsync("selectAll", elementReference);
    }

它工作正常,但这需要 razor 组件注入 JSInteropService,然后对于每个此类功能(如 SalectAll),我调用该服务并引用 ElementReference。例如:

@inject JSInteropService JS

<input @ref=@EditTextBox />

@code {
    ElementReference EditTextBox;

    async Task SelectAll()
    {
        await JS.SelectAll(EditTextBox)
    }
}

但我想做的是向 ElementReference 添加另一个名为 SelectAll 的扩展方法,目的是我可以替换上面的 SelectAll() 方法并调用:

await EditTextBox.SelectAllAsync()

但是,这需要我的静态扩展类才能获得 JSInteropService。

当我在静态类中没有可用的注入时,是否可以从 DI 容器中提取它?

我的 razor 组件在 Razor 类库中。

0 个答案:

没有答案