1- using System ;
1+ using Ardalis . GuardClauses ;
2+ using Serilog . Ui . Core . Models ;
3+ using System ;
24using System . Collections . Generic ;
35using System . Linq ;
46using System . Threading ;
57using System . Threading . Tasks ;
6- using Ardalis . GuardClauses ;
7- using Serilog . Ui . Core . Models ;
88
9- namespace Serilog . Ui . Core
9+ namespace Serilog . Ui . Core ;
10+
11+ /// <summary>
12+ /// Aggregates multiple <see cref="IDataProvider" /> into one instance.
13+ /// </summary>
14+ public class AggregateDataProvider : IDataProvider
1015{
16+ private readonly Dictionary < string , IDataProvider > _dataProviders = new ( ) ;
17+
1118 /// <summary>
12- /// Aggregates multiple <see cref="IDataProvider"/> into one instance .
19+ /// It creates an instance of <see cref="AggregateDataProvider" /> .
1320 /// </summary>
14- public class AggregateDataProvider : IDataProvider
21+ /// <param name="dataProviders">IEnumerable of providers.</param>
22+ /// <exception cref="ArgumentNullException">when <paramref name="dataProviders" /> is null</exception>
23+ /// <exception cref="ArgumentException">when <paramref name="dataProviders" /> is empty</exception>
24+ public AggregateDataProvider ( IEnumerable < IDataProvider > dataProviders )
1525 {
16- private readonly Dictionary < string , IDataProvider > _dataProviders = new ( ) ;
26+ List < IDataProvider > providers = Guard . Against . NullOrEmpty ( dataProviders ) . ToList ( ) ;
1727
18- /// <summary>
19- /// It creates an instance of <see cref="AggregateDataProvider"/>.
20- /// </summary>
21- /// <param name="dataProviders">IEnumerable of providers.</param>
22- /// <exception cref="ArgumentNullException">when <paramref name="dataProviders"/> is null</exception>
23- /// <exception cref="ArgumentException">when <paramref name="dataProviders"/> is empty</exception>
24- public AggregateDataProvider ( IEnumerable < IDataProvider > dataProviders )
28+ foreach ( List < IDataProvider > ? grouped in providers . GroupBy ( dp => dp . Name , p => p , ( _ , e ) => e . ToList ( ) ) )
2529 {
26- var providers = Guard . Against . NullOrEmpty ( dataProviders ) . ToList ( ) ;
27-
28- foreach ( var grouped in providers . GroupBy ( dp => dp . Name , p => p , ( _ , e ) => e . ToList ( ) ) )
29- {
30- var name = grouped [ 0 ] . Name ;
30+ string name = grouped [ 0 ] . Name ;
3131
32- if ( grouped . Count == 1 )
32+ if ( grouped . Count == 1 )
33+ _dataProviders . Add ( name , grouped [ 0 ] ) ;
34+ else
35+ // When providers with the same name are registered, we ensure uniqueness by
36+ // generating a key I.e. ["MSSQL.dbo.logs", "MSSQL.dbo.logs"] =>
37+ // ["MSSQL.dbo.logs[0]", "MSSQL.dbo.logs[1]"]
38+ for ( int i = 0 ; i < grouped . Count ; i ++ )
3339 {
34- _dataProviders . Add ( name , grouped [ 0 ] ) ;
40+ IDataProvider ? dataProvider = grouped [ i ] ;
41+ _dataProviders . Add ( $ "{ name } [{ i } ]", dataProvider ) ;
3542 }
36- else
37- {
38- // When providers with the same name are registered, we ensure uniqueness by
39- // generating a key I.e. ["MSSQL.dbo.logs", "MSSQL.dbo.logs"] =>
40- // ["MSSQL.dbo.logs[0]", "MSSQL.dbo.logs[1]"]
41- for ( var i = 0 ; i < grouped . Count ; i ++ )
42- {
43- var dataProvider = grouped [ i ] ;
44- _dataProviders . Add ( $ "{ name } [{ i } ]", dataProvider ) ;
45- }
46- }
47- }
48-
49- SelectedDataProvider = _dataProviders . First ( ) . Value ;
5043 }
5144
52- /// <summary>
53- /// <inheritdoc cref="IDataProvider.Name"/>
54- /// NOTE: We assume only one Aggregate provider, so the name is static.
55- /// </summary>
56- public string Name => nameof ( AggregateDataProvider ) ;
45+ SelectedDataProvider = _dataProviders . First ( ) . Value ;
46+ }
47+
48+ /// <summary>
49+ /// If there is only one data provider, this is it.
50+ /// If there are multiple, this is the current data provider.
51+ /// </summary>
52+ private IDataProvider SelectedDataProvider { get ; set ; }
53+
54+ /// <summary>
55+ /// Existing data providers keys.
56+ /// </summary>
57+ public IEnumerable < string > Keys => _dataProviders . Keys ;
5758
58- /// <summary>
59- /// If there is only one data provider, this is it.
60- /// If there are multiple, this is the current data provider .
61- /// </summary>
62- private IDataProvider SelectedDataProvider { get ; set ; }
59+ /// <summary>
60+ /// <inheritdoc cref="IDataProvider.Name" />
61+ /// NOTE: We assume only one Aggregate provider, so the name is static .
62+ /// </summary>
63+ public string Name => nameof ( AggregateDataProvider ) ;
6364
64- /// <summary>
65- /// Switch active data provider by key.
66- /// </summary>
67- /// <param name="key">Data provider key</param>
68- public void SwitchToProvider ( string key ) => SelectedDataProvider = _dataProviders [ key ] ;
65+ /// <inheritdoc />
66+ public Task < ( IEnumerable < LogModel > , int ) > FetchDataAsync ( FetchLogsQuery queryParams ,
67+ CancellationToken cancellationToken = default )
68+ => SelectedDataProvider . FetchDataAsync ( queryParams , cancellationToken ) ;
6969
70- /// <summary>
71- /// Existing data providers keys.
72- /// </summary>
73- public IEnumerable < string > Keys => _dataProviders . Keys ;
70+ /// <inheritdoc />
71+ public Task < DashboardModel > FetchDashboardAsync ( CancellationToken cancellationToken = default )
72+ => SelectedDataProvider . FetchDashboardAsync ( cancellationToken ) ;
7473
75- /// <inheritdoc/>
76- public Task < ( IEnumerable < LogModel > , int ) > FetchDataAsync ( FetchLogsQuery queryParams , CancellationToken cancellationToken = default )
77- => SelectedDataProvider . FetchDataAsync ( queryParams , cancellationToken ) ;
78- }
74+ /// <summary>
75+ /// Switch active data provider by key.
76+ /// </summary>
77+ /// <param name="key">Data provider key</param>
78+ public void SwitchToProvider ( string key ) => SelectedDataProvider = _dataProviders [ key ] ;
7979}
0 commit comments