2017-02-14 53 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

+0

+10爲@ NightOwl888。 – Steven

回答

3

@NightOwl888 comment我是在錯誤的道路,我結束了創建下列服務:

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

信用:@ NightOwl888

1

爲什麼不只是傳遞IStringLocalizer作爲參數:

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

的擴展方法的目的是爲了延長對象的行爲。在我看來,這就是你想要做的。