在扩展方法

时间:2017-10-12 13:35:28

标签: c# .net-core

我为IUrlHelper创建了扩展方法。

public static class UrlHelperExtensions
{
    public static string JavaScript(this IUrlHelper helper, string contentPath, IOptions<TypeScriptOptions> tsOptions)
    {
        if (tsOptions.Value != null && tsOptions.Value.Minify)
        {
            contentPath = Path.ChangeExtension(contentPath, ".min.js");
        }
        return helper.Content(contentPath);
    }

    public static string Css(this IUrlHelper helper, string contentPath, IOptions<LessOptions> lessOptions)
    {
        if (lessOptions.Value != null && lessOptions.Value.Minify)
        {
            contentPath = Path.ChangeExtension(contentPath, ".min.css");
        }
        return helper.Content(contentPath);
    }
}

我想将IOptions<TypeScriptOptions> tsOptionsIOptions<LessOptions> lessOptions传递给使用.NET Core依赖注入的方法。

在Razor视图中,我有以下内容:

@inject IOptions<CssOptions> lessOptions
<link href="@Url.Css("~/css/site.css", lessOptions)" rel="stylesheet" asp-append-version="true">

但我只想做:

<link href="@Url.Css("~/css/site.css")" rel="stylesheet" asp-append-version="true">

我已经尝试过查看.NET核心文档,并且我已经完成了一些谷歌搜索,但我似乎无法找到一种方法来实现我想要的东西,而无需借助Tag Helpers不是我想做的事。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

正如@Romoku所说,扩展方法是静态方法,只将state作为参数(或来自静态)。

您需要继续使用您拥有的策略,并将其作为参数传递。或者放弃扩展方法的想法并创建一些通过DI解决的辅助类或服务:

public class UrlHelperService
{
    private IOptions<CssOptions> _cssOptions;
    private IOptions<JavaScriptOptions> _jsOptions;
    private IUrlHelper _urlHelper;

    public UrlHelperService(
        IOptions<CssOptions> cssOptions,
        IOptions<JavaScriptOptions> jsOptions,
        IUrlHelper urlHelper)
    {
        _cssOptions = cssOptions;
        _jsOptions = jsOptions;
        _urlHelper = urlHelper;
    }

    public string JavaScript(string contentPath)
    {
        if (_jsOptions.Value != null && _jsOptions.Value.Minify)
        {
            contentPath = Path.ChangeExtension(contentPath, ".min.js");
        }
        return _urlHelper.Content(contentPath);
    }

    public string Css(string contentPath)
    {
        if (_cssOptions.Value != null && _cssOptions.Value.Minify)
        {
            contentPath = Path.ChangeExtension(contentPath, ".min.css");
        }
        return _urlHelper.Content(contentPath);
    }
}

容器需要注册此类,例如:

services.AddScoped<UrlHelperService>() 或者这种类型的生命周期。

该服务将在您的视图中注入,而不是options实例:

@inject UrlHelperService urlHelperService 
<link href="@urlHelperService.Css("~/css/site.css")" rel="stylesheet" asp-append-version="true">