2017-05-27 4 views
0

コントローラから派生したクラスでIStringLocalizerインターフェイスを使用する方法を理解しています(hereまたはhereなど)。コントローラではないクラスでIStringLocalizerを使用できますか

コントローラから派生しないクラスでIStringLocalizerを使用する正しい方法は何でしょうか?

この質問に対処する例はありません。

IStringLocalizerまたはIStringLocalizerFactoryを常にコンストラクタに渡す必要がありますか?

注意。
これはかなり一般的な質問です(スタックオーバーフローは具体的なプログラミングに関する質問です)。背景は、.NETプロジェクトのローカリゼーションツールを作成することです。私は、ASP.NET Coreプロジェクトのローカリゼーションをサポートするために、私のツールがソースコードに対してどのような変更を加えなければならないか把握しようとしています。

+0

IStringLocalizerは、ASP.NET Coreビルトイン[DIコンテナ](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)で解決されます。あなたはDIを介して解決されるクラスにconstuctorに 'IStringLocalizer'を注入することもできます。それを試してみることができますか? –

+0

ありがとう@IlyaChumakov、私はそれを試してみます。私は別の質問を見つけました。ここで良い説明をしています(https://stackoverflow.com/questions/37189984/dependency-injection-with-classes-other-than-a-controller-class)。実際、私の質問は重複することに近いです。 –

+0

はい、このように見えます。 –

答えて

0

クラスがControllerから派生しているかどうかは関係ありません。

hereのように、新しい演算子を使用するのではなく、依存関係の注入コンテナによってオブジェクトを作成することが重要です。すべてのクラスでASP.NETコアのローカリゼーションメカニズムを使用する場合は、このパターンをオブジェクト作成に使用する必要があります。

This pageは、オブジェクトの作成方法をよく説明していますが、ローカライゼーションの仕組みの例を挙げてみます。

MyHelperクラスを作成しました。クラスは、ローカライザオブジェクトがコンストラクタに渡されることを期待しています。ローカライズされた文字列を返す単一のプロパティHelloが含まれています。起動クラスでConfigureServices方法で

namespace AddingLocalization.Classes 
{ 
    public class MyHelper 
    { 
    private readonly IStringLocalizer<MyHelper> _localizer; 

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

    public string Hello 
    { 
     get 
     { 
     return _localizer["Hello World."]; 
     } 
    } 

    } 
} 

、Iは定型コードがhereを説明し、依存性注入コンテナとクラスMyHelperを登録する行を追加して追加しました。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddLocalization(opts => opts.ResourcesPath = "Resources"); 

    services.AddMvc() 
      .AddViewLocalization (
       LanguageViewLocationExpanderFormat.Suffix, 
       opts => opts.ResourcesPath = "Resources") 
      .AddDataAnnotationsLocalization(); 

    // This line registers the class MyHelper with the 
    // Dependency Injection Container.  
    services.AddTransient<MyHelper>(); 
} 

は私のコントローラクラスで、Iは、メンバ変数に格納されているコンストラクタに型MyHelperのパラメータを追加しました。

public class HomeController : Controller 
{ 
    private readonly IStringLocalizer<HomeController> _localizer ; 
    private readonly MyHelper       _h ; 

    public HomeController (IStringLocalizer<HomeController> localizer, 
          MyHelper       h) 
    { 
    _localizer = localizer; 
    _h   = h ; 
    } 

    ... 

    public IActionResult About() 
    { 
    ViewData["Message"] = _h.Hello ; 
    return View(); 
    } 

    ... 
} 

クラスMyHelperは、依存性注入コンテナに登録されているので、このオブジェクトを作成し、自動的にコンストラクタに渡します。これは、依存性注入コンテナによって実行される魔法です。

About()メソッドでは、MyHelperオブジェクトからプロパティを取得します。

これはコードに関するものですが、実際にリソースファイルから文字列を読み取ることが確実になりたかったのです。

リソースファイルの命名規則は、hereに記載されている:

それは、アセンブリの名前なしに、クラスの完全な名前に基づいています。私の場合、クラスはAddingLocalization.Classes.MyHelperと呼ばれ、アセンブリはAddingLocalizationと呼ばれるので、関連する名前はClasses.MyHelperです。

は、ドットやサブディレクトリを使用して、実際には二つの命名規則がありますので、我々は、リソースファイルに

  • のいずれかを呼び出すことができますClasses.MyHelper.resx
  • クラス\ MyHelper.resx

ConfigureServicesのボイラープレートコードはResourcesPath "Resources"を指定していましたので、ここでリソースファイルを配置する必要があります。私は2番目の命名オプションを選択したので、私のリソースファイルが

  • 資源である\クラス\ MyHelper.resx

あなたはソリューションエクスプローラで見ることができるよう

2017-05-28_09-30-59.png

我々が行いますVisual StudioにリソースにアクセスするためのMyHelper.Designer.csファイルを作成する必要はないため、リソースファイルのCustomToolプロパティをクリアする必要があります。名前は、有効なリソース名ではありません、我々はカスタムツールを無効にしない場合は、おそらく、エラーメッセージが生成されますので、

enter image description here

これは、重要です。

(マイクロソフトから前のローカライズ方法は、()常にスペースの代わりにunderscroreで製作リソース名(例を使用している)リソースにアクセスする。新しいASP.NETコアローカリゼーションは、リソース名として元の文字列を使用しています。)

以下に示すように最後に、私はリソース文字列を定義しています

enter image description here

私は実際には(まだ)異なる言語でのリソースにアクセスしようとしていないが、Localizerオブジェクトが正しくリソースを読みました。

関連する問題