/// <summary>
        /// Adds a sovrin issuer agent with the provided configuration
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="agentConfiguration">The agent configuration.</param>
        /// <param name="serviceConfiguration">The service resolution configuration</param>
        public static void AddAgent(this IServiceCollection services,
                                    Action <AgentConfiguration> agentConfiguration = null, Action <AgentServicesBuilder> serviceConfiguration = null)
        {
            RegisterCoreServices(services);

            var serviceBuilder = new AgentServicesBuilder(services);

            serviceConfiguration?.Invoke(serviceBuilder);
            serviceBuilder.AddCoreServices();

            services = serviceBuilder.Services;

            var defaultConfiguration = new AgentConfiguration();

            agentConfiguration?.Invoke(defaultConfiguration);

            services.Configure <WalletOptions>((obj) =>
            {
                obj.WalletConfiguration = defaultConfiguration.WalletOptions.WalletConfiguration;
                obj.WalletCredentials   = defaultConfiguration.WalletOptions.WalletCredentials;
            });

            services.Configure <PoolOptions>((obj) =>
            {
                obj.PoolName        = defaultConfiguration.PoolOptions.PoolName;
                obj.GenesisFilename = defaultConfiguration.PoolOptions.GenesisFilename;
            });
        }
        public static AgentServicesBuilder AddMemoryCacheLedgerService(this AgentServicesBuilder builder, MemoryCacheEntryOptions options = null)
        {
            builder.AddExtendedLedgerService <MemoryCacheLedgerService>()
            .Services.AddMemoryCache()
            .AddSingleton(_ => options);

            return(builder);
        }
 public static AgentServicesBuilder AddCoreServices(this AgentServicesBuilder builder)
 {
     builder.Services.TryAddSingleton <IConnectionService, DefaultConnectionService>();
     builder.Services.TryAddSingleton <ICredentialService, DefaultCredentialService>();
     builder.Services.TryAddSingleton <ILedgerService, DefaultLedgerService>();
     builder.Services.TryAddSingleton <IMessageSerializer, DefaultMessageSerializer>();
     builder.Services.TryAddSingleton <IPoolService, DefaultPoolService>();
     builder.Services.TryAddSingleton <IProofService, DefaultProofService>();
     builder.Services.TryAddSingleton <IProvisioningService, DefaultProvisioningService>();
     builder.Services.TryAddSingleton <IRouterService, DefaultRouterService>();
     builder.Services.TryAddSingleton <ISchemaService, DefaultSchemaService>();
     builder.Services.TryAddSingleton <ITailsService, DefaultTailsService>();
     builder.Services.TryAddSingleton <IWalletRecordService, DefaultWalletRecordService>();
     builder.Services.TryAddSingleton <IWalletService, DefaultWalletService>();
     return(builder);
 }
 public static AgentServicesBuilder AddExtendedMessageSerializer <TImplementation>(this AgentServicesBuilder builder)
     where TImplementation : class, IMessageSerializer
 {
     builder.Services.AddSingleton <IMessageSerializer, TImplementation>();
     return(builder);
 }
 public static AgentServicesBuilder AddExtendedMessageSerializer <TService, TImplementation>(this AgentServicesBuilder builder)
     where TService : class, IMessageSerializer
     where TImplementation : class, TService, IMessageSerializer
 {
     builder.Services.AddSingleton <TImplementation>();
     builder.Services.AddSingleton <IMessageSerializer>(x => x.GetService <TImplementation>());
     builder.Services.AddSingleton <TService>(x => x.GetService <TImplementation>());
     return(builder);
 }
 public static AgentServicesBuilder AddExtendedLedgerService <TImplementation>(this AgentServicesBuilder builder)
     where TImplementation : class, ILedgerService
 {
     builder.Services.AddSingleton <ILedgerService, TImplementation>();
     return(builder);
 }
 public static AgentServicesBuilder AddExtendedCredentialService <TService, TImplementation>(this AgentServicesBuilder builder)
     where TService : class, ICredentialService
     where TImplementation : class, TService, ICredentialService
 {
     builder.Services.AddSingleton <TImplementation>();
     builder.Services.AddSingleton <ICredentialService>(x => x.GetService <TImplementation>());
     builder.Services.AddSingleton <TService>(x => x.GetService <TImplementation>());
     return(builder);
 }