protected AbstractCompositeDataProvider(string databaseName, [NotNull] params DataProvider[] providers)
        {
            Assert.ArgumentNotNull(providers, nameof(providers));

            DatabaseName = databaseName;
            _ReadOnlyProviders.AddRange(providers.OfType <ReadOnlyDataProvider>());
            _HeadProvider   = providers.Single(x => !(x is ReadOnlyDataProvider));
            _HeadProviderEx = (IDataProviderEx)HeadProvider;
        }
        public void AddDataProvider([NotNull] DataProvider dataProvider)
        {
            Assert.ArgumentNotNull(dataProvider, nameof(dataProvider));

            lock (_ReadOnlyProviders)
            {
                var readOnlyDataProvider = dataProvider as ReadOnlyDataProvider;
                if (readOnlyDataProvider == null)
                {
                    Assert.IsNull(_HeadProvider, "The head provider is already defined");

                    Log.Info($"Add [{DatabaseName}] HEAD data provider: {dataProvider.GetType().FullName}", this);

                    _HeadProvider   = dataProvider;
                    _HeadProviderEx = (IDataProviderEx)dataProvider;
                }
                else
                {
                    Log.Info($"Add [{DatabaseName}] read-only data provider: {dataProvider.GetType().FullName}", this);

                    _ReadOnlyProviders.Add(readOnlyDataProvider);
                }
            }
        }