@@ -15,20 +15,36 @@ public abstract class BaseStorage<T, TOptions> : IStorage<T, TOptions> where TOp
15
15
{
16
16
protected bool IsContainerCreated ;
17
17
protected TOptions StorageOptions ;
18
+ private readonly SemaphoreSlim _semaphoreSlim = new ( 1 , 1 ) ;
18
19
19
20
protected BaseStorage ( TOptions storageOptions )
20
21
{
21
22
Contract . Assert ( storageOptions is not null ) ;
22
23
StorageOptions = storageOptions ! ;
24
+ // ReSharper disable once VirtualMemberCallInConstructor
23
25
StorageClient = CreateStorageClient ( ) ;
24
26
}
25
27
26
28
public async Task < Result > CreateContainerAsync ( CancellationToken cancellationToken = default )
27
29
{
28
- var result = await CreateContainerInternalAsync ( cancellationToken ) ;
29
- cancellationToken . ThrowIfCancellationRequested ( ) ;
30
- IsContainerCreated = result . IsSuccess ;
31
- return result ;
30
+ try
31
+ {
32
+ await _semaphoreSlim . WaitAsync ( cancellationToken ) ;
33
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
34
+
35
+ var result = await CreateContainerInternalAsync ( cancellationToken ) ;
36
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
37
+ IsContainerCreated = result . IsSuccess ;
38
+ return result ;
39
+ }
40
+ catch ( Exception ex )
41
+ {
42
+ return Result . Fail ( ex ) ;
43
+ }
44
+ finally
45
+ {
46
+ _semaphoreSlim . Release ( ) ;
47
+ }
32
48
}
33
49
34
50
public abstract Task < Result > RemoveContainerAsync ( CancellationToken cancellationToken = default ) ;
@@ -89,15 +105,15 @@ public Task<Result<BlobMetadata>> UploadAsync(FileInfo fileInfo, Action<UploadOp
89
105
public Task < Result < BlobMetadata > > UploadAsync ( Stream stream , UploadOptions options , CancellationToken cancellationToken = default )
90
106
{
91
107
if ( string . IsNullOrWhiteSpace ( options . MimeType ) )
92
- options . MimeType = MimeHelper . BIN ;
108
+ options . MimeType = MimeHelper . GetMimeType ( options . FileName ) ;
93
109
94
110
return UploadInternalAsync ( stream , SetUploadOptions ( options ) , cancellationToken ) ;
95
111
}
96
112
97
113
public Task < Result < BlobMetadata > > UploadAsync ( byte [ ] data , UploadOptions options , CancellationToken cancellationToken = default )
98
114
{
99
115
if ( string . IsNullOrWhiteSpace ( options . MimeType ) )
100
- options . MimeType = MimeHelper . BIN ;
116
+ options . MimeType = MimeHelper . GetMimeType ( options . FileName ) ;
101
117
102
118
return UploadInternalAsync ( new MemoryStream ( data ) , SetUploadOptions ( options ) , cancellationToken ) ;
103
119
}
@@ -269,13 +285,16 @@ public Task<Result> SetStorageOptions(Action<TOptions> options, CancellationToke
269
285
270
286
protected abstract T CreateStorageClient ( ) ;
271
287
272
- protected Task < Result > EnsureContainerExist ( )
288
+ protected Task < Result > EnsureContainerExist ( CancellationToken cancellationToken = default )
273
289
{
290
+ if ( StorageClient is null )
291
+ throw new InvalidOperationException ( "Storage client is not initialized." ) ;
292
+
274
293
if ( IsContainerCreated )
275
294
return Result . Succeed ( )
276
295
. AsTask ( ) ;
277
296
278
- return CreateContainerAsync ( ) ;
297
+ return CreateContainerAsync ( cancellationToken ) ;
279
298
}
280
299
281
300
protected UploadOptions SetUploadOptions ( UploadOptions options )
0 commit comments