2017-02-01 6 views
2

В следующей программе, чтобы получить строки ресурсов, я использую _localizer [«О заголовке»], где «О заголовке» является магической строкой. Как избежать использования таких строк? Есть ли строго типизированный способ?Как получить строки ресурсов в строго типизированном виде в ядре asp.net?

using Microsoft.AspNetCore.Mvc; 
using Microsoft.Extensions.Localization; 

namespace Localization.StarterWeb.Controllers 
{ 
    [Route("api/[controller]")] 
    public class AboutController : Controller 
    { 
     private readonly IStringLocalizer<AboutController> _localizer; 

     public AboutController(IStringLocalizer<AboutController> localizer) 
     { 
      _localizer = localizer; 
     } 

     [HttpGet] 
     public string Get() 
     { 
      return _localizer["About Title"]; 
     } 
    } 
} 
+0

Поддержка ресурсов resx обеспечивает локализацию и доступ к значениям, которые строго типизируются благодаря кодегену, который создает для вас классы. Вы можете добавить файлы ресурсов из Add> New Item в visual studio. – Oliver

ответ

4

Если вы пытаетесь избежать с помощью жёстко прописанные строки (ключ) для поиска преобразования локализации можно создать LocalizationKeys класс, который содержит ключи просмотра для вас. Затем вы можете воспользоваться оператором C# 6nameof. Это поможет облегчить беспокойство «магических струн».

public static class LocalizationKeys 
{ 
    public const string AboutTitle = nameof(AboutTitle); // Note: this is "AboutTitle" 

    // ... other keys here 
} 

Тогда вы можете потреблять его везде. Одно из преимуществ заключается в том, что, поскольку это член класса, если изменения ключа вы можете использовать общие инструменты рефакторинга, чтобы безопасно заменить все ссылки на него, а не пытаться заменить глобальную строку на «магическую строку». Еще одно преимущество - вы можете использовать intellisense при доступе к классу. Полагаю, можно было бы считать это «сильно типизированным».

Вы бы потреблять его как таковые:

[Route("api/[controller]")] 
public class AboutController : Controller 
{ 
    private readonly IStringLocalizer<AboutController> _localizer; 

    public AboutController(IStringLocalizer<AboutController> localizer) 
    { 
     _localizer = localizer; 
    } 

    [HttpGet] 
    public string Get() 
    { 
     return _localizer[LocalizationKeys.AboutTitle]; 
    } 
} 

Если вы действительно хотите получить фантазии с C# 6 вы также можете использовать статическое использование. Это позволит вам ссылаться на члены указанного вами типа. Наконец, для простых «одиночных строк» ​​мы можем сделать их тела выражений. Например:

using Microsoft.AspNetCore.Mvc; 
using Microsoft.Extensions.Localization; 
using static Localization.StarterWeb.LocalizationKeys; // Note: static keyword 

namespace Localization.StarterWeb.Controllers 
{ 
    [Route("api/[controller]")] 
    public class AboutController : Controller 
    { 
     private readonly IStringLocalizer<AboutController> _localizer; 

     public AboutController(IStringLocalizer<AboutController> localizer) 
     { 
      _localizer = localizer; 
     } 

     [HttpGet] 
     public string Get() => _localizer[AboutTitle]; // Note: omission of qualifier 
    } 
} 
Смежные вопросы