2017-10-12 79 views
2

我已經爲IUrlHelper創建了擴展方法。在擴展方法中使用.net核心依賴關係

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核心的依賴注入的方法。

在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,這不是我想做的事。

我該如何得到這個工作?

+5

傳遞到方法?你想製作一箇中間件嗎?擴展方法是靜態的,因此任何狀態都必須是靜態的或傳入的。 – Romoku

+0

我已更新我的問題以提供答案。 –

回答

2

正如@Romoku所說,擴展方法是靜態方法,只能將狀態作爲參數(或來自靜態)。

您需要繼續使用您的策略,並將其作爲參數傳遞。或丟棄擴展方法的想法,並創建一些輔助類或服務,得到通過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); 
    } 
} 

的容器需要這個類註冊,e.g:

services.AddScoped<UrlHelperService>() 或任何生命週期的這種類型應該有。

而服務將在您的視圖,而不是options情況下被注入:

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

我認爲使用服務的想法是最有意義的,所以我會採用這種方法。 –

相關問題