/// <summary>
        /// Sets default row fields provider. This instance is required
        /// as rows might have to be created in contexts where dependency injection
        /// is not possible, like deserialization. If using a DI container,
        /// set this at startup to the same singleton service you register with DI.
        /// </summary>
        /// <param name="provider">Provider. Required.</param>
        /// <returns>Old default provider</returns>
        public static IRowFieldsProvider SetDefault(IRowFieldsProvider provider)
        {
            var old = defaultProvider;

            defaultProvider = provider ?? throw new ArgumentNullException(nameof(provider));
            return(old);
        }
        /// <summary>
        /// Sets local row fields provider for current thread and async context.
        /// Useful for background tasks, async methods, and testing to set provider locally and for
        /// auto spawned threads.
        /// </summary>
        /// <param name="provider">Row fields provider. Can be null.</param>
        /// <returns>Old local provider if any.</returns>
        public static IRowFieldsProvider SetLocal(IRowFieldsProvider provider)
        {
            var old = localProvider.Value;

            localProvider.Value = provider;
            return(old);
        }
 static RowFieldsProvider()
 {
     defaultProvider = FallbackRowFieldsProvider.Instance;
     localProvider   = new AsyncLocal <IRowFieldsProvider>();
 }