2017-10-12 34 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); 
    } 
} 

私は、.NETのコアの依存性注入を使用する方法にIOptions<TypeScriptOptions> tsOptionsIOptions<LessOptions> lessOptionsに合格したいと思います。カミソリで

私は、次のしているビュー:

@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のコアのドキュメントを見てみました、私はしましたいくつかのGoogle検索を行ったが、私がしたいことではないタグヘルパーに頼らずに、自分が望むものを達成する方法を見つけることができないようだ。

これを動作させるにはどうすればよいですか?

+5

パス:

そして、サービスではなくoptionsインスタンスのビューに注入されるのでしょうか?あなたはミドルウェアを作ろうとしていますか?拡張メソッドは静的なので、どの状態も静的であるか、渡されなければなりません。 – Romoku

+0

答えを提供するために質問を更新しました。 –

答えて

2

@Romokuによると、拡張メソッドは静的メソッドであり、引数として(または静的な状態から)状態を取るだけです。

あなたが持っている戦略を引き続き引数として渡す必要があります。または拡張メソッドのアイデアをドロップすると、DIを経て解決さいく​​つかのヘルパークラスまたはサービスを作成:

services.AddScoped<UrlHelperService>() または任意のライフサイクルこのタイプは持っている必要があります:コンテナは、例えば登録このクラスを必要と

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); 
    } 
} 

を。どこ方法に

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

私はサービスを使うという考え方が最も理にかなっていると思いますので、私はその方法に行きます。 –

関連する問題