Storage | Messaging | Reflection
The Namotion.Storage .NET libraries provide abstractions and implementations for storage services like blob storages, file systems or object storages.
By programming against a storage abstraction you enable the following scenarios:
- Build multi-cloud capable applications by being able to change storage technologies on demand.
- Quickly switch to different storage technologies to find the best technological fit for your applications.
- Implement behavior driven integration tests which can run in-memory or against different technologies for better debugging experiences or local execution.
- Provide better local development experiences, e.g. replace Azure Blob Storage with the local file system or an in-memory implementation.
In your application root, create an IBlobStorage instance with an actual implementation package and retrieve a blob container:
var storage = AzureBlobStorage.CreateFromConnectionString("MyConnectionString");
IBlobContainer container = storage.GetContainer("MyContainer");
IBlobContainer<Person> typedContainer = container.WithBlobType<Person>();
await typedContainer.WriteJsonAsync("MyPath", new Person { ... });
var person = await typedContainer.ReadJsonAsync("MyPath");In your business service classes you should then only use the abstraction interfaces like IBlobContainer or IObjectStorage, etc.
Blobs
Inject IBlobStorage or IBlobContainer but do not get a container from a blob storage in the consuming class (violates SRP).
- IBlobStorage: A blob storage where blobs are stored in a container and cannot be directly stored. Only
containerName/blobNameorcontainerName/subDirectories/blobNameare allowed. - IBlobContainer<T>
- IBlobContainer: A blob container where blobs can be directly stored or in a subdirectory. A container acts like a simple/basic virtual file system.
OpenWriteAsync: Creates or overrides an existing blobOpenAppendAsync: Creates or appends to an existing blobOpenReadAsyncExistsAsyncGetAsyncListAsyncDeleteAsync: Deletes a blob
- BlobElement: Metadata and properties of a blob or container.
Internal:
- IBlobReader: Internal (do not use directly.)
- IBlobWriter: Internal (do not use directly.)
The idea behind the generic interfaces is to allow multiple instance registrations, read Dependency Injection in .NET: A way to work around missing named registrations for more information.
Objects
- IObjectStorage<T>
WriteAsync(id, value)ReadAsync(id)DeleteAsync(id)
Extension methods:
WriteAsJson(): Writes an object as JSON into a blob container/storage.ReadAsJson(): Reads an object as JSON from a blob container/storage.CreateJsonObjectStorage<T>(): Creates anIObjectStorage<T>for a givenIBlobContainer. Usage:var objectStorage = blobContainer.CreateJsonObjectStorage<Person>().
The following packages should only be used in the head project, i.e. directly in your application bootstrapping project where the dependency injection container is initialized.
Implementations:
- FileSystemBlobStorage
- InMemoryBlobStorage
Extensions:
WithBlobType<T>(): Adds a blob type to anIBlobStorage/IBlobContainerand transforms it into aIBlobStorage<T>/IBlobContainer<T>.Wrap<T>()/Wrap(): Adds an interceptor to the blob storage (blobStorage.Wrap(s => new MyInterceptor(s))). An interceptor can be implemented as a new class inheriting from theBlobStorageclass and overriding some methods.
Implementations:
- AzureBlobStorage
Implementations:
- FtpBlobStorage