Spoleto.Delivery
1.0.7
See the version list below for details.
dotnet add package Spoleto.Delivery --version 1.0.7
NuGet\Install-Package Spoleto.Delivery -Version 1.0.7
<PackageReference Include="Spoleto.Delivery" Version="1.0.7" />
paket add Spoleto.Delivery --version 1.0.7
#r "nuget: Spoleto.Delivery, 1.0.7"
// Install Spoleto.Delivery as a Cake Addin #addin nuget:?package=Spoleto.Delivery&version=1.0.7 // Install Spoleto.Delivery as a Cake Tool #tool nuget:?package=Spoleto.Delivery&version=1.0.7
Spoleto.Delivery
Spoleto.Delivery is a comprehensive solution designed to integrate delivery functionality into your .NET applications. This project provides a maintainable architecture that simplifies interaction with various delivery providers (e.g., Cdek, MasterPost).
This project supports .NET Standard 2.0, .NET 7, and .NET 8.
https://github.com/spoleto-software/Spoleto.Delivery
Features
- Abstraction Layer: Simplifies the integration of delivery services by providing a unified interface.
- Multiple Providers: Supports various delivery providers, allowing you to switch or combine them easily.
- Async Support: Fully supports asynchronous operations for improved performance.
Quick setup
Begin by installing the package through the NuGet package manager with the command:
Install-Package Spoleto.Delivery
.
Usage
Main Interface
The main interface, IDeliveryService
, serves as an abstraction layer for the delivery of goods. Below is a sample implementation:
namespace Spoleto.Delivery
{
public interface IDeliveryService
{
IEnumerable<IDeliveryProvider> Providers { get; }
IDeliveryProvider DefaultProvider { get; }
List<City> GetCities(CityRequest cityRequest);
List<City> GetCities(string providerName, CityRequest cityRequest);
List<City> GetCities(DeliveryProviderName providerName, CityRequest cityRequest);
List<City> GetCities(IDeliveryProvider provider, CityRequest cityRequest);
Task<List<City>> GetCitiesAsync(CityRequest cityRequest);
Task<List<City>> GetCitiesAsync(string providerName, CityRequest cityRequest);
Task<List<City>> GetCitiesAsync(DeliveryProviderName providerName, CityRequest cityRequest);
Task<List<City>> GetCitiesAsync(IDeliveryProvider provider, CityRequest cityRequest);
List<Tariff> GetTariffs(TariffRequest tariffRequest);
List<Tariff> GetTariffs(string providerName, TariffRequest tariffRequest);
List<Tariff> GetTariffs(DeliveryProviderName providerName, TariffRequest tariffRequest);
List<Tariff> GetTariffs(IDeliveryProvider provider, TariffRequest tariffRequest);
Task<List<Tariff>> GetTariffsAsync(TariffRequest tariffRequest);
Task<List<Tariff>> GetTariffsAsync(string providerName, TariffRequest tariffRequest);
Task<List<Tariff>> GetTariffsAsync(DeliveryProviderName providerName, TariffRequest tariffRequest);
Task<List<Tariff>> GetTariffsAsync(IDeliveryProvider provider, TariffRequest tariffRequest);
List<AdditionalService> GetAdditionalServices(Tariff tariff);
List<AdditionalService> GetAdditionalServices(string providerName, Tariff tariff);
List<AdditionalService> GetAdditionalServices(DeliveryProviderName providerName, Tariff tariff);
List<AdditionalService> GetAdditionalServices(IDeliveryProvider provider, Tariff tariff);
Task<List<AdditionalService>> GetAdditionalServicesAsync(Tariff tariff);
Task<List<AdditionalService>> GetAdditionalServicesAsync(string providerName, Tariff tariff);
Task<List<AdditionalService>> GetAdditionalServicesAsync(DeliveryProviderName providerName, Tariff tariff);
Task<List<AdditionalService>> GetAdditionalServicesAsync(IDeliveryProvider provider, Tariff tariff);
DeliveryOrder CreateDeliveryOrder(DeliveryOrderRequest deliveryOrderRequest);
DeliveryOrder CreateDeliveryOrder(string providerName, DeliveryOrderRequest deliveryOrderRequest);
DeliveryOrder CreateDeliveryOrder(DeliveryProviderName providerName, DeliveryOrderRequest deliveryOrderRequest);
DeliveryOrder CreateDeliveryOrder(IDeliveryProvider provider, DeliveryOrderRequest deliveryOrderRequest);
Task<DeliveryOrder> CreateDeliveryOrderAsync(DeliveryOrderRequest deliveryOrderRequest);
Task<DeliveryOrder> CreateDeliveryOrderAsync(string providerName, DeliveryOrderRequest deliveryOrderRequest);
Task<DeliveryOrder> CreateDeliveryOrderAsync(DeliveryProviderName providerName, DeliveryOrderRequest deliveryOrderRequest);
Task<DeliveryOrder> CreateDeliveryOrderAsync(IDeliveryProvider provider, DeliveryOrderRequest deliveryOrderRequest);
}
}
DeliveryProvider
Each delivery provider must implement the IDeliveryProvider
interface:
namespace Spoleto.Delivery.Providers
{
public interface IDeliveryProvider
{
string Name { get; }
List<City> GetCities(CityRequest cityRequest);
Task<List<City>> GetCitiesAsync(CityRequest cityRequest);
List<Tariff> GetTariffs(TariffRequest tariffRequest);
Task<List<Tariff>> GetTariffsAsync(TariffRequest tariffRequest);
List<AdditionalService> GetAdditionalServices(Tariff tariff);
Task<List<AdditionalService>> GetAdditionalServicesAsync(Tariff tariff);
DeliveryOrder CreateDeliveryOrder(DeliveryOrderRequest deliveryOrderRequest);
Task<DeliveryOrder> CreateDeliveryOrderAsync(DeliveryOrderRequest deliveryOrderRequest);
}
}
DeliveryProvider is the underlying mechanisms that enable the actual delivery functionality. When you incorporate Spoleto.Delivery into your application, it's mandatory to install at least one of the available delivery providers.
The providers come as pre-configured NuGet packages:
- Spoleto.Delivery.Cdek: Delivery via CDEK https://www.cdek.ru/;
- Spoleto.Delivery.MasterPost: Delivery via MasterPost https://mplogistics.ru/;
Example
Here is a simple example to demonstrate how to use Spoleto.Delivery in your project:
using Spoleto.Delivery;
using Spoleto.Delivery.Providers;
public class Example
{
public async Task Run()
{
var deliveryService = new DeliveryServiceFactory()
.WithOptions(x => x.DefaultProvider == CdekProvider.ProviderName)
.AddProvider(new CdekProvider(cdekOptions))
.AddProvider(new MasterPostProvider(masterPostOptions))
.Build();
var cityRequest = new CityRequest
{
Name = "Москва"
};
var cities = await deliveryService.GetCitiesAsync(cityRequest);
var tariffRequest = new TariffRequest
{
FromLocation = new() { ProviderLocationCode = "270" },
ToLocation = new() { ProviderLocationCode = "44" },
Packages =
[
new()
{
Weight = 4000,
Height = 10,
Width = 10,
Length = 10
}
],
};
var tariffs = await deliveryService.GetTariffsAsync(tariffRequest);
var deliveryOrderRequest = new DeliveryOrderRequest
{
Type = OrderType.RegularDelivery,
Comment = "Just another test order",
FromLocation = new()
{
ProviderLocationCode = "44",
Address = "пр. Ленинградский, д.4",
},
ToLocation = new()
{
ProviderLocationCode = "44",
FiasId = Guid.Parse("0c5b2444-70a0-4932-980c-b4dc0d3f02b5"),
Address = "ул. Блюхера, 32"
},
TariffCode = tariffs.First().Code,
Packages =
[
new()
{
Number = "1",
Comment = "Test",
Weight = 1000,
Width = 10,
Height = 10,
Length = 10,
},
],
Sender = new()
{
Company = "Roga",
Name = "Copyta",
Email = "roga@copyta.com",
Phones =
[
new() { Number = "+71111111111" },
],
},
Recipient = new()
{
Company = "Ushi",
Name = "Hvost",
Email = "ushi@hvost.com",
Phones =
[
new() { Number = "+72222222222" },
],
},
};
var order = await deliveryService.CreateDeliveryOrderAsync(deliveryOrderRequest);
Console.WriteLine($"Order created with ID: {order.Uuid} and Number: {order.Number}");
}
}
Dependency Injection
To integrate Spoleto.Delivery into Microsoft Dependency injection framework, you should utilize the Spoleto.Delivery.Extensions NuGet package. This package provides an extension method for the IServiceCollection
interface, which register the DeliveryService as a scoped service.
The extentions for Delivery providers come as pre-configured NuGet packages:
- Spoleto.Delivery.Extensions.Cdek: CDEK registration;
- Spoleto.Delivery.Extensions.MasterPost: MasterPost registration.
After ensuring that the Spoleto.Delivery.Extensions
package with at least one Delivery provider package are installed from NuGet, you can proceed with the registration of Spoleto.Delivery within the Startup.cs
or your DI configuration file in the following manner:
public void ConfigureServices(IServiceCollection services)
{
// Other DI registrations...
// Register Spoleto.Delivery as a scoped service:
services.AddDelivery(MasterPostProvider.ProviderName)
.AddMasterPost("MasterPost_IndividualClientNumber", "MasterPost_ApiKey", "MasterPost_ApiKey", "MasterPost_ServiceUrl")
.AddCdek("Cdek_CliendId", "Cdek_ClientSecret", "Cdek_ServiceUrl");
// Continue with the rest of your service configuration...
}
Injecting the Delivery Service into Your Classes
Once Spoleto.Delivery has been registered with your Dependency Injection framework, you can facilitate the injection of the Delivery service into any class within your application.
Inject the IDeliveryService
interface into the constructors of the classes where you want to use Delivery functionality:
public class YourDeliveryClass
{
private readonly ILogger<YourDeliveryClass> _logger;
private readonly IDeliveryService _deliveryService;
public YourDeliveryClass(ILogger<YourDeliveryClass> logger, IDeliveryService deliveryService)
{
_logger = logger;
_deliveryService = deliveryService;
}
public async Task CreateDeliveryOrder(ModelRequest from, ModelRequest to, ModelData data)
{
// create a DeliveryOrderRequest
var deliveryOrderRequest = CreateDeliveryOrderRequest(from, to, data);
// create the delivery order using the default Delivery provider:
var order = await _deliveryService.CreateDeliveryOrderAsync(deliveryOrderRequest);
// create the delivery order using the specified Delivery provider:
var order1 = await _deliveryService.CreateDeliveryOrderAsync(DeliveryProviderName.Cdek, deliveryOrderRequest);
var order2 = await _deliveryService.CreateDeliveryOrderAsync(DeliveryProviderName.MasterPost, deliveryOrderRequest);
// log the result:
_logger.LogInformation("Order created with ID: {order.Uuid} and Number: {order.Number}", order.Uuid, order.Number);
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Spoleto.AddressResolver (>= 1.0.1)
- Spoleto.Common (>= 2.9.17.1649)
-
net7.0
- Spoleto.AddressResolver (>= 1.0.1)
- Spoleto.Common (>= 2.9.17.1649)
-
net8.0
- Spoleto.AddressResolver (>= 1.0.1)
- Spoleto.Common (>= 2.9.17.1649)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Spoleto.Delivery:
Package | Downloads |
---|---|
Spoleto.Delivery.Extensions
Delivery sender with different Delivery providers such as CDEK, MasterPost |
|
Spoleto.Delivery.MasterPost
MasterPost provider for Spoleto.Delivery |
|
Spoleto.Delivery.Cdek
CDEK provider for Spoleto.Delivery |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.43 | 227 | 11/12/2024 |
1.0.42 | 206 | 11/12/2024 |
1.0.41 | 212 | 11/11/2024 |
1.0.40 | 222 | 11/8/2024 |
1.0.39 | 226 | 11/6/2024 |
1.0.38 | 210 | 11/6/2024 |
1.0.37 | 261 | 10/4/2024 |
1.0.36 | 203 | 10/4/2024 |
1.0.35 | 217 | 10/4/2024 |
1.0.34 | 205 | 10/4/2024 |
1.0.33 | 217 | 10/4/2024 |
1.0.32 | 207 | 10/4/2024 |
1.0.31 | 219 | 10/3/2024 |
1.0.30 | 201 | 10/3/2024 |
1.0.29 | 211 | 10/3/2024 |
1.0.28 | 201 | 10/3/2024 |
1.0.27 | 204 | 10/3/2024 |
1.0.26 | 205 | 10/3/2024 |
1.0.25 | 209 | 10/3/2024 |
1.0.24 | 213 | 10/3/2024 |
1.0.23 | 228 | 10/2/2024 |
1.0.22 | 208 | 10/2/2024 |
1.0.21 | 221 | 10/1/2024 |
1.0.20 | 241 | 9/30/2024 |
1.0.19 | 216 | 9/29/2024 |
1.0.18 | 219 | 9/28/2024 |
1.0.17 | 222 | 9/28/2024 |
1.0.16 | 235 | 9/25/2024 |
1.0.15 | 228 | 9/24/2024 |
1.0.14 | 218 | 9/24/2024 |
1.0.13 | 225 | 9/24/2024 |
1.0.12 | 233 | 9/23/2024 |
1.0.11 | 232 | 9/23/2024 |
1.0.10 | 235 | 9/23/2024 |
1.0.9 | 213 | 9/19/2024 |
1.0.8 | 244 | 9/19/2024 |
1.0.7 | 236 | 9/18/2024 |
1.0.6 | 232 | 9/18/2024 |
1.0.5 | 253 | 9/17/2024 |
1.0.4 | 304 | 9/12/2024 |
1.0.3 | 300 | 9/6/2024 |
1.0.2 | 272 | 8/7/2024 |
1.0.1 | 326 | 6/13/2024 |
1.0.0 | 256 | 6/12/2024 |