https://github.com/RicoSuter/Namotion.Storage
.NET abstractions and implementations for storage services like blob storages, file systems or object storages.
https://github.com/RicoSuter/Namotion.Storage
Last synced: 6 months ago
JSON representation
.NET abstractions and implementations for storage services like blob storages, file systems or object storages.
- Host: GitHub
- URL: https://github.com/RicoSuter/Namotion.Storage
- Owner: RicoSuter
- License: mit
- Created: 2019-07-31T12:14:38.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-09-05T16:13:39.000Z (about 2 years ago)
- Last Synced: 2024-10-29T20:02:21.589Z (11 months ago)
- Language: C#
- Homepage:
- Size: 124 KB
- Stars: 36
- Watchers: 5
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Namotion.Storage
Storage | [Messaging](https://github.com/RicoSuter/Namotion.Messaging) | [Reflection](https://github.com/RicoSuter/Namotion.Reflection)
[](https://dev.azure.com/rsuter/Namotion/_build?definitionId=20)
[](https://dev.azure.com/rsuter/Namotion/_build?definitionId=20)
[](https://discord.gg/BxQNy25WF6)
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.## Usage
In your application root, create an `IBlobStorage` instance with an actual implementation package and retrieve a blob container:
```csharp
var storage = AzureBlobStorage.CreateFromConnectionString("MyConnectionString");
IBlobContainer container = storage.GetContainer("MyContainer");
IBlobContainer typedContainer = container.WithBlobType();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.
## Core packages
### Namotion.Storage.Abstractions
[](https://www.nuget.org/packages/Namotion.Storage.Abstractions/)
[](https://apimundo.com/organizations/nuget-org/nuget-feeds/public/packages/Namotion.Storage.Abstractions/versions/latest?tab=types)**Blobs**
Inject `IBlobStorage` or `IBlobContainer` but do not get a container from a blob storage in the consuming class (violates [SRP](http://software-pattern.org/single-responsibility-principle)).
- **IBlobStorage**: A blob storage where blobs are stored in a container and cannot be directly stored. Only `containerName/blobName` or `containerName/subDirectories/blobName` are allowed.
- **IBlobContainer\**
- **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 blob
- `OpenAppendAsync`: Creates or appends to an existing blob
- `OpenReadAsync`
- `ExistsAsync`
- `GetAsync`
- `ListAsync`
- `DeleteAsync`: 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](https://blog.rsuter.com/dotnet-dependency-injection-way-to-work-around-missing-named-registrations/) for more information.
**Objects**
- **IObjectStorage\**
- `WriteAsync(id, value)`
- `ReadAsync(id)`
- `DeleteAsync(id)`### Namotion.Storage.Json
[](https://www.nuget.org/packages/Namotion.Storage.Json/)
[](https://apimundo.com/organizations/nuget-org/nuget-feeds/public/packages/Namotion.Storage.Json/versions/latest?tab=types)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()`: Creates an `IObjectStorage` for a given `IBlobContainer`. Usage: `var objectStorage = blobContainer.CreateJsonObjectStorage()`.## Implementation packages
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.
### Namotion.Storage
[](https://www.nuget.org/packages/Namotion.Storage/)
[](https://apimundo.com/organizations/nuget-org/nuget-feeds/public/packages/Namotion.Storage/versions/latest?tab=types)Implementations:
- FileSystemBlobStorage
- InMemoryBlobStorageExtensions:
- `WithBlobType()`: Adds a blob type to an `IBlobStorage/IBlobContainer` and transforms it into a `IBlobStorage/IBlobContainer`.
- `Wrap()/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 the `BlobStorage` class and overriding some methods.### Namotion.Storage.Azure.Storage.Blob
[](https://www.nuget.org/packages/Namotion.Storage.Azure.Storage.Blob/)
[](https://apimundo.com/organizations/nuget-org/nuget-feeds/public/packages/Namotion.Storage.Azure.Storage.Blob/versions/latest?tab=types)Implementations:
- AzureBlobStorage
### Namotion.Storage.Ftp
[](https://www.nuget.org/packages/Namotion.Storage.Ftp.Blob/)
[](https://apimundo.com/organizations/nuget-org/nuget-feeds/public/packages/Namotion.Storage.Ftp/versions/latest?tab=types)Implementations:
- FtpBlobStorage