• Lexical
Show / Hide Table of Contents
  • Lexical.FileSystem
    • Introduction
    • Abstractions
      • IFileSystem
        • IFileSystem
        • IFileSystemBrowse
        • IFileSystemCreateDirectory
        • IFileSystemDelete
        • IFileSystemFileAttribute
        • IFileSystemMount
        • IFileSystemMove
        • IFileSystemObserve
        • IFileSystemOpen
      • IEvent
      • IEntry
      • IOption
      • IToken
    • FileSystem
    • VirtualFileSystem
    • MemoryFileSystem
    • EmbeddedFileSystem
    • HttpFileSystem
    • Decoration
    • IFileProvider
    • Utility
      • DisposeList
      • FileScanner
      • VisitTree
      • File Operation
  • Lexical.FileProvider
    • Introduction
    • Package
    • Package.Abstractions
    • Root
    • Zip
    • Dll
    • SharpCompress
    • SharpZipLib
    • FileScanner
    • Utils
  • Lexical.Localization
    • Introduction
    • Tutorial
    • Asset
      • IAsset
      • IStringAsset
    • Line
      • ILine
      • ILineFactory
      • ILineRoot
      • ILineFormat
      • ILineLogger
      • LineComparer
    • File
      • ILineReader
      • ILineWriter
      • Ini
      • Json
      • Xml
      • Resx
      • Resources
    • Miscellaneous
      • Plurality
      • ICulturePolicy
      • IStringFormat
      • Dependency Injection
    • Practices
      • Class Library
      • Class Library DI
      • Class Library DI opt.
  • Lexical.Utilities
    • Introduction
    • UnicodeString
    • FileScanner
    • Permutation
    • Tuples
    • StructList

Ms.DependencyInjection

Microsoft has introduced an abstraction to dependency injection in the NuGet package Microsoft.Extensions.DependencyInjection.Abstractions.

The extension method IServiceCollection.AddLexicalLocalization(addStringLocalizerService, addCulturePolicyService, useGlobalInstance, addCache) that adds various localization service implementations. The following services are added:

  • ILineRoot. If useGlobalInstance is true, then the root is global static.
  • ILine<T>
  • IAssetBuilder
  • ICulturePolicy, if addCulturePolicyService is set to true.
  • IStringLocalizerFactory and IStringLocalizer<T>, if addStringLocalizerService is set to true.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection();

// Configure to use CultureInfo.CurrentUICulture
serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());            

// Add localization services: ILineRoot, ILine<T>, IAssetBuilder, ICulturePolicy
serviceCollection.AddLexicalLocalization(
    addStringLocalizerService: false,
    addCulturePolicyService: false,
    useGlobalInstance: false,
    addCache: false);

Assets are contributed to the service provider by adding IAssetSources.

// Create localization source
var lines = new List<ILine> {
    LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!")
};
// Create asset source
IAssetSource assetSource = new StringAsset(lines).ToSource();
// Add asset source
serviceCollection.AddSingleton<IAssetSource>(assetSource);

Asset, root and keys can be acquired from the service provider.

// Build service provider
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
    // Service can provide the asset
    IAsset asset = serviceProvider.GetService<IAsset>();

    // Service can provide root
    ILineRoot root = serviceProvider.GetService<ILineRoot>();

    // Service can provide type key
    ILine typeKey = serviceProvider.GetService<ILine<ConsoleApp1.MyController>>();

    // Get "Hello World!"
    string str = typeKey.Key("Hello").Culture("en").ToString();
}
Example full code.
using Lexical.Localization;
using Lexical.Localization.Asset;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;

namespace docs
{
    public class Ms_DependencyInjection_Example1
    {
        public static void Main(string[] args)
        {
            // Create service collection
            IServiceCollection serviceCollection = new ServiceCollection();

            // Configure to use CultureInfo.CurrentUICulture
            serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());

            // Add localization services: ILineRoot, ILine<T>, IAssetBuilder
            serviceCollection.AddLexicalLocalization(
                addStringLocalizerService: false,
                addCulturePolicyService: false,
                useGlobalInstance: false,
                addCache: false);

            // Create localization source
            var lines = new List<ILine> { LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!") };
            // Create asset source
            IAssetSource assetSource = new StringAsset(lines).ToSource();
            // Add asset source
            serviceCollection.AddSingleton<IAssetSource>(assetSource);

            // Build service provider
            using (var serviceProvider = serviceCollection.BuildServiceProvider())
            {
                // Service can provide the asset
                IAsset asset = serviceProvider.GetService<IAsset>();

                // Service can provide root
                ILineRoot root = serviceProvider.GetService<ILineRoot>();

                // Service can provide type key
                ILine typeKey = serviceProvider.GetService<ILine<ConsoleApp1.MyController>>();

                // Get "Hello World!"
                string str = typeKey.Key("Hello").Culture("en").ToString();
            }
        }
    }

}

String localizer

When the argument addStringLocalizerService is set to true, then the extension method adds implementations to
services IStringLocalizer<T> and IStringLocalizerFactory.

  • Snippet
  • Full Code
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection();

// Configure to use CultureInfo.CurrentUICulture
serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());

// Add localization services: ILineRoot, ILine<T>, IAssetBuilder, 
//                            IStringLocalizer<T>, IStringLocalizerFactory
serviceCollection.AddLexicalLocalization(
    addStringLocalizerService: true,     // <- string localizer
    addCulturePolicyService: false,
    useGlobalInstance: false,
    addCache: false);

// Create localization source
var lines = new List<ILine> { LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!") };
// Create asset source
IAssetSource assetSource = new StringAsset(lines).ToSource();
// Add asset source
serviceCollection.AddSingleton<IAssetSource>(assetSource);

// Build service provider
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
    // Get string localizer for class "ConsoleApp1.MyController".
    IStringLocalizer stringLocalizer 
        = serviceProvider.GetService<IStringLocalizer<ConsoleApp1.MyController>>();

    // Narrow scope down to "en" culture
    IStringLocalizer stringLocalizerScoped = stringLocalizer.WithCulture(CultureInfo.GetCultureInfo("en"));

    // Get "Hello World!"
    string str = stringLocalizerScoped.GetString("Hello");
}
using Lexical.Localization;
using Lexical.Localization.Asset;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System.Collections.Generic;
using System.Globalization;

namespace docs
{
    public class Ms_DependencyInjection_Example2
    {
        public static void Main(string[] args)
        {
            #region Snippet
            // Create service collection
            IServiceCollection serviceCollection = new ServiceCollection();

            // Configure to use CultureInfo.CurrentUICulture
            serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());

            // Add localization services: ILineRoot, ILine<T>, IAssetBuilder, 
            //                            IStringLocalizer<T>, IStringLocalizerFactory
            serviceCollection.AddLexicalLocalization(
                addStringLocalizerService: true,     // <- string localizer
                addCulturePolicyService: false,
                useGlobalInstance: false,
                addCache: false);

            // Create localization source
            var lines = new List<ILine> { LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!") };
            // Create asset source
            IAssetSource assetSource = new StringAsset(lines).ToSource();
            // Add asset source
            serviceCollection.AddSingleton<IAssetSource>(assetSource);

            // Build service provider
            using (var serviceProvider = serviceCollection.BuildServiceProvider())
            {
                // Get string localizer for class "ConsoleApp1.MyController".
                IStringLocalizer stringLocalizer 
                    = serviceProvider.GetService<IStringLocalizer<ConsoleApp1.MyController>>();

                // Narrow scope down to "en" culture
                IStringLocalizer stringLocalizerScoped = stringLocalizer.WithCulture(CultureInfo.GetCultureInfo("en"));

                // Get "Hello World!"
                string str = stringLocalizerScoped.GetString("Hello");
            }
            #endregion Snippet
        }
    }

}

Links

  • Microsoft.Extensions.DependencyInjection.Abstractions (NuGet)
    • IServiceCollection
  • Microsoft.Extensions.DependencyInjection (NuGet)
  • Lexical.Localization (NuGet)
    • DependencyInjection
Back to top Copyright © 2015-2020 Toni Kalajainen