• Avalanche.Core
Search Results for

    Show / Hide Table of Contents
    • Avalanche.Accessor
      • Introduction
      • IAccessor
        • IAccessor
        • IListAccessor
        • IMapAccessor
        • IRecordAccessor
        • IContentAccessor
        • IOneOfAccessor
        • IAnyAccessor
      • .Net
        • Introduction
        • IList<T>
        • IDictionary<K,V>
        • FieldInfo
        • OneOfAttribute
        • StructLayoutAttribute
        • Class
      • Protobuf
        • Introduction
      • Articles
        • Dependency Injection
        • AccessorMessages
    • Avalanche.Binding
      • Introduction
    • Avalanche.Core
      • License
    • Avalanche.DataType
      • Introduction
      • DataType
        • IDataType
        • IListType
        • IMapType
        • IRecordType
        • IFieldType
        • IOneOfType
        • IAnyType
        • IStringType
        • IValueType
        • IIntegerType
        • IEnumerationType
        • IRealType
      • .Net
        • Introduction
        • IList<T>
        • IDictionary<K,V>
        • FieldInfo
        • Enum
        • OneOfAttribute
        • StructLayoutAttribute
        • Class
      • Protobuf
        • Introduction
      • Articles
        • DataTypeRequest
        • PrintTree
        • DataTypeMessages
    • Avalanche.Emit
      • Introduction
      • TypeBuilder
      • ConstructorBuilder
      • MethodBuilder
      • PropertyBuilder
      • FieldBuilder
      • Emit
      • Utilities
    • Avalanche.FileSystem
      • Introduction
      • Abstractions
        • IFileSystem
          • IFileSystemBrowse
          • IFileSystemCreateDirectory
          • IFileSystemDelete
          • IFileSystemFileAttribute
          • IFileSystemMount
          • IFileSystemMove
          • IFileSystemObserve
          • IFileSystemOpen
        • IEvent
        • IEntry
        • IOption
        • IToken
      • FileSystem
      • VirtualFileSystem
      • MemoryFileSystem
      • EmbeddedFileSystem
      • HttpFileSystem
      • Decoration
      • IFileProvider
      • Events
      • Utilities
        • Dispose
        • File Scanner
        • Visit Tree
        • File Operation
    • Avalanche.Identity
      • Introduction
      • Identity
      • IdentityParts
      • IdentityInterner
      • IdentityComparer
      • Print Tree
      • IdentityAccessors
        • Introduction
        • TypeName
    • Avalanche.Localization
      • Introduction
      • Localization
      • LocalizationFile
      • LocalizationFiles
      • LocalizationFileSystem
      • LocalizationFileFormat
      • LocalizationLine
      • LocalizationLines
      • TemplateFormat
      • CultureProvider
      • FallbackCultureProvider
      • ResourceManager
      • LocalizationError
      • Microsoft.Extensions
        • Introduction
        • DependencyInjection
        • FileProvider
        • Logging
        • ITextLocalizer
        • IFileLocalizer
        • Localization
      • Asp.Net
        • Introduction
        • Supplying localization
        • Inject to pages
        • Culture Assigned
        • Minimalistic Api
        • Diagnostics
      • Pluralization
        • Introduction
        • Multiple plural parameters
        • Custom PluralRules
        • Invariant Culture
        • Unit Prefix
        • IPluralRule
        • IPluralNumber
        • IPluralRules
        • CLDRs
        • Unicode.CLDR40
        • Unicode.CLDR41
        • Unicode.CLDR42
      • Articles
        • Alphabet localization
        • Benchmarks
        • Caching
        • Class Library
        • Demo
        • Diagnostics
        • Embedded resources
        • Emplacement
        • File localization
        • Text localization
        • Printing templates
    • Avalanche.Message
      • Introduction
      • IMessage
      • IMessageProvider
      • IMessageDescription
      • IMessageDescriptions
      • MessageLevel
      • Message printing
      • Messages and Exceptions
      • Microsoft.Extensions
        • DependencyInjection
      • Articles
        • Aggregate Messages
        • Localization
        • Logging
        • Validation
    • Avalanche.Service
      • Introduction
      • Service
        • Introduction
        • IService
        • IServiceDisposable
        • IServiceDecoration
        • IServiceCast
        • IServiceObservable
        • IServiceContainer
        • Construction
        • Query
        • CancellationToken
        • CachePolicy
        • Scope
      • Handler
        • Introduction
        • IHandler
        • IHandlerCast
        • IHandlerDecoration
        • IHandlerWithOrder
        • CancellationToken
        • Cyclicity
        • Delegates
        • Invokable
        • ExportAttribute
        • OrderAttribute
        • PrintTree
        • Recursion
      • Query
        • Introduction
        • IQuery
        • IQueryCast
        • IQueryDecoration
      • Entry
        • Introduction
        • IEntry
        • IEntryCast
        • IEntryDecoration
        • IEntryObservable
        • IEntryVisitable
        • EntryState
      • Request
        • Introduction
        • IRequest
        • IRequestFor
        • IRequestToBeCached
        • IRequestToBeDisposed
        • RequestAttribute
        • ContextParameterAttribute
        • Print Tree
      • Dependency Injection
        • Introduction
        • Asp.Net
        • ServiceRequest<T>
        • Decorating a service
        • Handler
        • CachePolicy
        • CancellationToken
        • QueryLogger
      • Examples
        • NodeCount
        • Expression
        • Mapper
      • Articles
        • Benchmarks
        • Error Handling
        • ServiceMessages
    • Avalanche.StatusCode
      • Introduction
      • HResult
        • Introduction
        • HResult.Facilities
        • BasicMessages
        • RpcMessages
        • DispatchMessages
        • ItfMessages
        • Win32Messages
        • ClrMessages
      • System
        • Introduction
        • AccessControlMessages
        • AggregateMessages
        • AppDomainMessages
        • ArgumentMessages
        • ArgumentNullMessages
        • ArgumentOutOfRangeMessages
        • ArithmeticMessages
        • ArrayMessages
        • AssemblyMessages
        • BadImageFormatMessages
        • CodeContractMessages
        • CodePageMessages
        • CollectionsMessages
        • CompilerServiceMessages
        • CryptographyMessages
        • CultureMessages
        • DiagnosticsMessages
        • EventSourceMessages
        • ExecutionEngineMessages
        • FormatMessages
        • HostProtectionMessages
        • IOMessages
        • IndexOutOfRangeMessages
        • InteropServiceMessages
        • InvalidCastMessages
        • InvalidOperationMessages
        • IsolatedStorageMessages
        • LazyMessages
        • MarshalerMessages
        • MemoryMessages
        • MiscellaneousMessages
        • NotImplementedMessages
        • NotSupportedMessages
        • ObjectDisposedMessages
        • OperationCanceledMessages
        • OverflowMessages
        • PlatformMessages
        • PolicyMessages
        • PrincipalMessages
        • ProgramMessages
        • ReferenceMessages
        • ReflectionMessages
        • RegionMessages
        • RemotingMessages
        • ResourcesMessages
        • SecurityMessages
        • SerializationMessages
        • StackMessages
        • TaskMessages
        • TextMessages
        • ThreadingMessages
        • TimeZoneMessages
        • TypeMessages
        • XmlMessages
      • HttpStatusCode
      • OpcUaStatusCode
    • Avalanche.Template
      • Introduction
      • TemplateFormats
      • ITemplatePrintable
      • ITemplateFormatPrintable
      • ITemplateText
      • ITemplateBreakdown
      • ITemplateFormat
      • ITemplateFormats
      • Extract Arguments
      • Emplacement
    • Avalanche.Tokenizer
      • Introduction
      • IToken
      • ITokenizer
      • Tokenizers
    • Avalanche.Utilities
      • Introduction
      • Collections
        • Tuples
        • StructList
        • ArrayList
        • BijectionMap
        • LocakableDictionary
        • LockableList
        • MapList
        • Pipe
        • RingQueue
        • EnumerableExtensions
        • TupleUtilities
        • ArrayUtilities
      • Comparers
        • IGraphComparer
        • IGraphComparable
        • AlphaNumericComparer
        • EnumerableComparer
        • EnumerableGraphComparer
        • ReferenceComparer
        • KeyValuePairComparer
        • DefaultComparerProvider
        • RecordComparer
      • Cloners
        • ICloner
        • IGraphCloner
        • IGraphCloneable
        • ListCloner
        • DictionaryCloner
        • FieldCloner
        • PassthroughCloner
        • RecordCloner
        • ClonerProvider
      • Dispose
        • IDisposeAttachable
        • IDisposeBelatable
      • Provider
        • Introduction
        • ProviderBase
        • Delegate
        • Pipe
        • Cache
        • ResultCapture
        • AsReadOnly
        • AsService
        • IProviderEvent
      • Record
        • IRecordDescription
        • IFieldDescription
        • IConstructorDescription
        • IConstructionDescription
        • IParameterDescription
        • IRecordProviders
        • RecordDelegates
          • RecordCreate
          • RecordClone
          • RecordCopy
          • IRecordDelegates
        • FieldDelegates
          • FieldRead
          • FieldWrite
          • RecreateWith
          • IFieldDelegates
      • String
        • IEscaper
        • UnicodeString
      • Miscellaneous
        • IIdGenerator
        • Permutation
        • IReadOnly
        • IUserDataContainer
        • Void
    • Avalanche.Writer
      • Introduction
      • ConstantWriter
      • Context
      • ConvertWriter
      • DefaultConstructor
      • DelegateWriter
      • PassthroughWriter
      • Referer
      • TypeCast
      • Writer
      • WriterPipe
      • WriterMessages

    Dependency Injection

    Avalanche.Service.DependencyInjection.dll adds glue-on support for dependency injection.

    There are three ways how dependency injection can be used with Avalanche.Service.

    One, is to adapt ServiceDescriptions into handlers and use Avalanche.Service as Avalanche.Service.IService and thus System.IServiceProvider (Avalanche.Service.IService extends System.IServiceProvider).

    // Create service descriptor
    ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
    // Create service provider
    IService service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor));
    // Get service
    MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
    

    On Asp.Net see instructions.


    Two, is to build from IServiceCollection into Avalanche.Service as DI implementation (instead of Microsoft's DI implementation).

    .BuildAvalancheServiceProvider() builds IService (and IServiceProvider).

    // Create service collection
    IServiceCollection serviceCollection = new ServiceCollection()
        .AddHandlers(ServiceHandlers.Instance)
        .AddCachePolicy(CachePolicies.Default)
        .AddTransient<MyClass>();
    // Create service
    using IServiceDisposable service = serviceCollection.BuildAvalancheServiceProvider();
    // Get service
    MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
    


    Three, is to use Avalanche.Service.IService as another injectible service in microsoft's DI implementation. .AddAvalancheService() adds ServiceDescriptions for IService. Note that, this way handlers cannot participate in construction of services described with ServiceDescription.

    // Create service collection
    IServiceCollection serviceCollection = new ServiceCollection()
        .AddAvalancheService()
        .AddHandlers(ServiceHandlers.Instance)
        .AddCachePolicy(CachePolicies.Default)
        .AddTransient<MyClass>();
    // Create service provider
    using ServiceProvider service = serviceCollection.BuildServiceProvider();
    // Get service
    MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
    

    IService gets injected.

    public class MyClass
    {
        IService service;
    
        public MyClass(IService service)
        {
            this.service = service;
        }
    }
    
    Note

    If there is discrepancy between Microsoft's and Avalanche dependency injection implementation, please report it to github issue tracking.

    Full Example

    Full example
    using System;
    using Avalanche.Service;
    using Microsoft.Extensions.DependencyInjection;
    
    class di_index
    {
        public static void Run()
        {
            {
                // <11>
                // Create service descriptor
                ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
                // Create service provider
                IService service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor));
                // Get service
                MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
                // </11>
            }
            // The minimum set of handlers is: <b>ServiceRequestHandler</b>, <b>ServiceSelfProvider</b>, <b>ServiceProviderSelfProvider</b> and <b>ServiceScopeHandler</b>.
            {
                // <12>
                // Create a list of service descriptors
                IServiceCollection serviceCollection = new ServiceCollection()
                    .AddSingleton<MyClass>();
                // Create service provider
                IService service = Services.Create(
                    (ServiceHandlers.Instance.ServiceRequestHandler,       // Avalanche.Service.dll
                     ServiceHandlers.Instance.ServiceSelfProvider,         // Avalanche.Service.dll
                     ServiceHandlers.Instance.ServiceProviderSelfProvider, // Avalanche.Service.dll
                     ServiceScopeHandler.Instance,                         // Avalanche.Service.DependencyInjection.dll
                     serviceCollection)
                );
                // Get service
                MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
                // </12>
            }
    
            {
                // <21>
                // Create service collection
                IServiceCollection serviceCollection = new ServiceCollection()
                    .AddHandlers(ServiceHandlers.Instance)
                    .AddCachePolicy(CachePolicies.Default)
                    .AddTransient<MyClass>();
                // Create service
                using IServiceDisposable service = serviceCollection.BuildAvalancheServiceProvider();
                // Get service
                MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
                // </21>
            }
    
            {
                // <31>
                // Create service collection
                IServiceCollection serviceCollection = new ServiceCollection()
                    .AddAvalancheService()
                    .AddHandlers(ServiceHandlers.Instance)
                    .AddCachePolicy(CachePolicies.Default)
                    .AddTransient<MyClass>();
                // Create service provider
                using ServiceProvider service = serviceCollection.BuildServiceProvider();
                // Get service
                MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
                // </31>
            }
        }
    
        // <MyClass>
        public class MyClass
        {
            IService service;
    
            public MyClass(IService service)
            {
                this.service = service;
            }
        }
        // </MyClass>
    }
    
    In This Article
    Back to top Copyright © Toni Kalajainen