@@ -40,23 +40,29 @@ internal class ParameterProviderBaseHandler : IParameterProviderBaseHandler
4040
4141 /// <summary>
4242 /// The CacheManager instance.
43+ /// Thread-safe: volatile ensures visibility across threads.
4344 /// </summary>
44- private ICacheManager ? _cache ;
45+ private volatile ICacheManager ? _cache ;
4546
4647 /// <summary>
4748 /// The TransformerManager instance.
49+ /// Thread-safe: volatile ensures visibility across threads.
4850 /// </summary>
49- private ITransformerManager ? _transformManager ;
51+ private volatile ITransformerManager ? _transformManager ;
5052
5153 /// <summary>
52- /// The DefaultMaxAge.
54+ /// The DefaultMaxAge stored as ticks for thread-safe access.
55+ /// Thread-safe: accessed via Interlocked operations.
56+ /// A value of 0 indicates null/not set.
5357 /// </summary>
54- private TimeSpan ? _defaultMaxAge ;
58+ private long _defaultMaxAgeTicks ;
5559
5660 /// <summary>
5761 /// The flag to raise exception on transformation error.
62+ /// Thread-safe: volatile ensures visibility across threads.
63+ /// Using int (0/1) instead of bool for Interlocked compatibility.
5864 /// </summary>
59- private bool _raiseTransformationError ;
65+ private volatile int _raiseTransformationError ;
6066
6167 /// <summary>
6268 /// The CacheMode.
@@ -100,6 +106,7 @@ internal ParameterProviderBaseHandler(GetAsyncDelegate getAsyncHandler,
100106
101107 /// <summary>
102108 /// Try transform a value using a transformer.
109+ /// Thread-safe: reads volatile field for raise error flag.
103110 /// </summary>
104111 /// <param name="transformer">The transformer instance to use.</param>
105112 /// <param name="value">The value to transform.</param>
@@ -121,7 +128,7 @@ internal ParameterProviderBaseHandler(GetAsyncDelegate getAsyncHandler,
121128 catch ( Exception e )
122129 {
123130 transformedValue = default ;
124- if ( _raiseTransformationError )
131+ if ( _raiseTransformationError != 0 )
125132 {
126133 if ( e is not TransformationException error )
127134 error = new TransformationException ( e . Message , e ) ;
@@ -140,32 +147,37 @@ internal ParameterProviderBaseHandler(GetAsyncDelegate getAsyncHandler,
140147
141148 /// <summary>
142149 /// Sets the cache maximum age.
150+ /// Thread-safe: uses Interlocked for atomic write.
143151 /// </summary>
144152 /// <param name="maxAge">The cache maximum age </param>
145153 public void SetDefaultMaxAge ( TimeSpan maxAge )
146154 {
147- _defaultMaxAge = maxAge ;
155+ Interlocked . Exchange ( ref _defaultMaxAgeTicks , maxAge . Ticks ) ;
148156 }
149157
150158 /// <summary>
151159 /// Gets the maximum age or default value.
160+ /// Thread-safe: uses Interlocked for atomic read.
152161 /// </summary>
153162 /// <returns>the maxAge</returns>
154163 public TimeSpan ? GetDefaultMaxAge ( )
155164 {
156- return _defaultMaxAge ;
165+ var ticks = Interlocked . Read ( ref _defaultMaxAgeTicks ) ;
166+ return ticks > 0 ? TimeSpan . FromTicks ( ticks ) : null ;
157167 }
158168
159169 /// <summary>
160170 /// Gets the maximum age or default value.
171+ /// Thread-safe: uses Interlocked for atomic read.
161172 /// </summary>
162173 /// <param name="config"></param>
163174 /// <returns>the maxAge</returns>
164175 public TimeSpan GetMaxAge ( ParameterProviderConfiguration ? config )
165176 {
166177 var maxAge = config ? . MaxAge ;
167178 if ( maxAge . HasValue && maxAge . Value > TimeSpan . Zero ) return maxAge . Value ;
168- if ( _defaultMaxAge . HasValue && _defaultMaxAge . Value > TimeSpan . Zero ) return _defaultMaxAge . Value ;
179+ var defaultMaxAgeTicks = Interlocked . Read ( ref _defaultMaxAgeTicks ) ;
180+ if ( defaultMaxAgeTicks > 0 ) return TimeSpan . FromTicks ( defaultMaxAgeTicks ) ;
169181 return CacheManager . DefaultMaxAge ;
170182 }
171183
@@ -208,11 +220,12 @@ public void AddCustomTransformer(string name, ITransformer transformer)
208220
209221 /// <summary>
210222 /// Configure the transformer to raise exception or return Null on transformation error
223+ /// Thread-safe: uses volatile field for visibility.
211224 /// </summary>
212225 /// <param name="raiseError">true for raise error, false for return Null.</param>
213226 public void SetRaiseTransformationError ( bool raiseError )
214227 {
215- _raiseTransformationError = raiseError ;
228+ _raiseTransformationError = raiseError ? 1 : 0 ;
216229 }
217230
218231 /// <summary>
0 commit comments