2017-02-14 15 views
3

Я пытаюсь получить экземпляр службы IStringLocalizer внутри метода расширения, возможно ли это? Любые предложения о том, как я должен его вводить?Injecting DI service по методу расширения

Моя цель здесь заключается в том, чтобы перевести тип, используя его название в качестве условного обозначения.

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

Целью методов расширения является расширить поведение объектов. Мне кажется, это то, что вы пытаетесь сделать здесь.