2017-02-14 9 views
3

IStringLocalizerサービスインスタンスを拡張メソッド内に取得しようとしていますか?どのように私はそれを注入すべきですかに関する任意の提案?拡張メソッドでDIサービスを注入

ここでの目標は、名前を規約として使用して型を変換することです。

public static class I18nExtensions 
{ 

    private IStringLocalizer _localizer; // <<< How to inject it? 

    public static string GetName(this Type type) 
    { 
     return _localizer[type.Name].Value; 
    } 
} 
+1

@ https://github.comを仕事ができるいくつかの醜いトリックがあります。/aspnet/DependencyInjection/issues/294 –

+4

私はあなたの拡張メソッドが依存関係を持っているので、独自のサービス( 'ITypeNameLocalizer')でなければならないと主張します。 *変更する可能性はほとんどなく、依存関係を持たない単純なロジックのための拡張メソッド*を確保する*。 @ NightOwl888の場合は – NightOwl888

+0

+10 – Steven

答えて

3

は私が間違った道にあった@NightOwl888 comment後、私は、次のサービスを作成することになったNightOwl888

1

理由だけパラメータとしてIStringLocalizerを渡さない:

public static string GetName(this Type type, IStringLocalizer localizer) 
{ 
    return localizer[type.Name].Value; 
} 

拡張メソッドの目的は、オブジェクトの挙動を拡張することです。それはあなたがここでやろうとしていることです。

public class TypeNameLocalizer : ITypeNameLocalizer 
{ 
    private IStringLocalizer localizer; 

    public TypeNameLocalizer(IStringLocalizer<Entities> localizer) 
    { 
     this.localizer = localizer; 
    } 
    public string this[Type type] 
    { 
     get 
     { 
      return localizer[type.Name]; 
     } 
    } 
} 

クレジット: