diff --git a/Directory.Build.props b/Directory.Build.props
index 83a0f05a..99c2facf 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -5,6 +5,7 @@
2.5.3
2.0.11
0.8.2
+ 1.7.0
\ No newline at end of file
diff --git a/EShop.sln b/EShop.sln
index f003f77d..3542d607 100644
--- a/EShop.sln
+++ b/EShop.sln
@@ -341,6 +341,20 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Coupo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Orders.Plugins.Coupons", "plugins\Coupons\src\EasyAbp.EShop.Orders.Plugins.Coupons\EasyAbp.EShop.Orders.Plugins.Coupons.csproj", "{3C385657-8365-470F-9F4F-30F31F9FCA42}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Inventories", "Inventories", "{9AC27747-E175-487F-92C9-434DEE543273}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DaprActors", "DaprActors", "{6E6FE4B9-4117-4F57-B219-EE47E4046096}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Products.DaprActorsInventory.Domain", "plugins\Inventories\DaprActors\src\EasyAbp.EShop.Products.DaprActorsInventory.Domain\EasyAbp.EShop.Products.DaprActorsInventory.Domain.csproj", "{6CD1A8B5-8AB7-4A31-8333-024A7FB602D1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions", "plugins\Inventories\DaprActors\src\EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions\EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions.csproj", "{CF4DE32D-9629-4C48-9BE8-5B83A1C27291}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Plugins.Inventories.DaprActors", "plugins\Inventories\DaprActors\src\EasyAbp.EShop.Plugins.Inventories.DaprActors\EasyAbp.EShop.Plugins.Inventories.DaprActors.csproj", "{B6F3ACD5-463E-4455-A094-057A82941A94}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F468A386-5660-4888-981A-6ECF15182D32}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{485204B1-7603-4EA0-B3A4-73CB89B0D5BC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -895,6 +909,18 @@ Global
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C385657-8365-470F-9F4F-30F31F9FCA42}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6CD1A8B5-8AB7-4A31-8333-024A7FB602D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6CD1A8B5-8AB7-4A31-8333-024A7FB602D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6CD1A8B5-8AB7-4A31-8333-024A7FB602D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6CD1A8B5-8AB7-4A31-8333-024A7FB602D1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CF4DE32D-9629-4C48-9BE8-5B83A1C27291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CF4DE32D-9629-4C48-9BE8-5B83A1C27291}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CF4DE32D-9629-4C48-9BE8-5B83A1C27291}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CF4DE32D-9629-4C48-9BE8-5B83A1C27291}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6F3ACD5-463E-4455-A094-057A82941A94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6F3ACD5-463E-4455-A094-057A82941A94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6F3ACD5-463E-4455-A094-057A82941A94}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6F3ACD5-463E-4455-A094-057A82941A94}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1065,6 +1091,13 @@ Global
{86CAD303-A0E5-42C9-89A5-61D9AAA4AD8F} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B}
{B076C103-DF0B-464B-A9CB-4BE5CAFEE067} = {4001814E-A67B-490D-9E13-2FB9A34B0A0B}
{3C385657-8365-470F-9F4F-30F31F9FCA42} = {72F34527-9295-4F29-923E-4B075A4F31A2}
+ {9AC27747-E175-487F-92C9-434DEE543273} = {94CC5A11-DA0F-413C-96CA-01DB0FC426E0}
+ {6E6FE4B9-4117-4F57-B219-EE47E4046096} = {9AC27747-E175-487F-92C9-434DEE543273}
+ {F468A386-5660-4888-981A-6ECF15182D32} = {6E6FE4B9-4117-4F57-B219-EE47E4046096}
+ {B6F3ACD5-463E-4455-A094-057A82941A94} = {F468A386-5660-4888-981A-6ECF15182D32}
+ {CF4DE32D-9629-4C48-9BE8-5B83A1C27291} = {F468A386-5660-4888-981A-6ECF15182D32}
+ {6CD1A8B5-8AB7-4A31-8333-024A7FB602D1} = {F468A386-5660-4888-981A-6ECF15182D32}
+ {485204B1-7603-4EA0-B3A4-73CB89B0D5BC} = {6E6FE4B9-4117-4F57-B219-EE47E4046096}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}
diff --git a/EShop.sln.DotSettings b/EShop.sln.DotSettings
index a1a9e93c..7b7d4176 100644
--- a/EShop.sln.DotSettings
+++ b/EShop.sln.DotSettings
@@ -21,4 +21,5 @@
False
SQL
True
+ True
True
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions.csproj b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions.csproj
new file mode 100644
index 00000000..f5d2ebb7
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsAbstractionsModule.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsAbstractionsModule.cs
new file mode 100644
index 00000000..37b93cf2
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsAbstractionsModule.cs
@@ -0,0 +1,11 @@
+using EasyAbp.EShop.Products;
+using Volo.Abp.Modularity;
+
+namespace EasyAbp.EShop.Plugins.Inventories.DaprActors;
+
+[DependsOn(
+ typeof(EShopProductsDomainSharedModule)
+)]
+public class EShopPluginsInventoriesDaprActorsAbstractionsModule : AbpModule
+{
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/IInventoryActor.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/IInventoryActor.cs
new file mode 100644
index 00000000..714904b5
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/IInventoryActor.cs
@@ -0,0 +1,13 @@
+using System.Threading.Tasks;
+using Dapr.Actors;
+
+namespace EasyAbp.EShop.Plugins.Inventories.DaprActors;
+
+public interface IInventoryActor : IActor
+{
+ Task GetInventoryStateAsync();
+
+ Task IncreaseInventoryAsync(int quantity, bool decreaseSold);
+
+ Task ReduceInventoryAsync(int quantity, bool increaseSold);
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryStateModel.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryStateModel.cs
new file mode 100644
index 00000000..96f0ef28
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryStateModel.cs
@@ -0,0 +1,8 @@
+namespace EasyAbp.EShop.Plugins.Inventories.DaprActors;
+
+public class InventoryStateModel
+{
+ public int Inventory { get; set; }
+
+ public long Sold { get; set; }
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xml b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xml
new file mode 100644
index 00000000..1715698c
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xsd b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xsd
new file mode 100644
index 00000000..ffa6fc4b
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors.Abstractions/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp.EShop.Plugins.Inventories.DaprActors.csproj b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp.EShop.Plugins.Inventories.DaprActors.csproj
new file mode 100644
index 00000000..cc8c0afd
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp.EShop.Plugins.Inventories.DaprActors.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsModule.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsModule.cs
new file mode 100644
index 00000000..a1d4f2c2
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/EShopPluginsInventoriesDaprActorsModule.cs
@@ -0,0 +1,15 @@
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.Modularity;
+
+namespace EasyAbp.EShop.Plugins.Inventories.DaprActors;
+
+[DependsOn(
+ typeof(EShopPluginsInventoriesDaprActorsAbstractionsModule)
+)]
+public class EShopPluginsInventoriesDaprActorsModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddActors(options => { options.Actors.RegisterActor(); });
+ }
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryActor.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryActor.cs
new file mode 100644
index 00000000..a53e7c53
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/EasyAbp/EShop/Plugins/Inventories/DaprActors/InventoryActor.cs
@@ -0,0 +1,76 @@
+using System.Threading.Tasks;
+using Dapr;
+using Dapr.Actors.Runtime;
+
+namespace EasyAbp.EShop.Plugins.Inventories.DaprActors;
+
+public class InventoryActor : Actor, IInventoryActor
+{
+ public InventoryActor(ActorHost host) : base(host)
+ {
+ }
+
+ protected override async Task OnActivateAsync()
+ {
+ await StateManager.TryAddStateAsync(Id.GetId(), new InventoryStateModel());
+ }
+
+ public virtual async Task GetInventoryStateAsync()
+ {
+ return await StateManager.GetStateAsync(Id.GetId());
+ }
+
+ public virtual async Task IncreaseInventoryAsync(int quantity, bool decreaseSold)
+ {
+ var state = await GetInventoryStateAsync();
+
+ InternalIncreaseInventory(state, quantity, decreaseSold);
+ }
+
+ public async Task ReduceInventoryAsync(int quantity, bool increaseSold)
+ {
+ var state = await GetInventoryStateAsync();
+
+ InternalReduceInventory(state, quantity, increaseSold);
+ }
+
+ protected virtual void InternalIncreaseInventory(InventoryStateModel stateModel, int quantity, bool decreaseSold)
+ {
+ if (quantity < 0)
+ {
+ throw new DaprException("Quantity should not be less than 0.");
+ }
+
+ if (decreaseSold && stateModel.Sold - quantity < 0)
+ {
+ throw new DaprException("Target Sold cannot be less than 0.");
+ }
+
+ stateModel.Inventory = checked(stateModel.Inventory + quantity);
+
+ if (decreaseSold)
+ {
+ stateModel.Sold -= quantity;
+ }
+ }
+
+ protected virtual void InternalReduceInventory(InventoryStateModel stateModel, int quantity, bool increaseSold)
+ {
+ if (quantity < 0)
+ {
+ throw new DaprException("Quantity should not be less than 0.");
+ }
+
+ if (quantity > stateModel.Inventory)
+ {
+ throw new DaprException("Insufficient inventory.");
+ }
+
+ if (increaseSold)
+ {
+ stateModel.Sold = checked(stateModel.Sold + quantity);
+ }
+
+ stateModel.Inventory -= quantity;
+ }
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xml b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xml
new file mode 100644
index 00000000..1715698c
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xsd b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xsd
new file mode 100644
index 00000000..ffa6fc4b
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Plugins.Inventories.DaprActors/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp.EShop.Products.DaprActorsInventory.Domain.csproj b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp.EShop.Products.DaprActorsInventory.Domain.csproj
new file mode 100644
index 00000000..93c911a8
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp.EShop.Products.DaprActorsInventory.Domain.csproj
@@ -0,0 +1,15 @@
+
+
+
+
+
+ net6.0
+
+
+
+
+
+
+
+
+
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/DaprActorsProductInventoryProvider.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/DaprActorsProductInventoryProvider.cs
new file mode 100644
index 00000000..cdb0e46d
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/DaprActorsProductInventoryProvider.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Dapr.Actors;
+using Dapr.Actors.Client;
+using EasyAbp.EShop.Plugins.Inventories.DaprActors;
+using EasyAbp.EShop.Products.ProductInventories;
+using Microsoft.Extensions.Logging;
+using Volo.Abp.DependencyInjection;
+
+namespace EasyAbp.EShop.Products.DaprActorsInventory;
+
+public class DaprActorsProductInventoryProvider : IProductInventoryProvider, ITransientDependency
+{
+ public static string DaprActorsProductInventoryProviderName { get; set; } = "DaprActors";
+ public static string DaprActorsProductInventoryProviderDisplayName { get; set; } = "DaprActors";
+ public static string DaprActorsProductInventoryProviderDescription { get; set; } = "DaprActors";
+
+ public string InventoryProviderName { get; } = DaprActorsProductInventoryProviderName;
+
+ public static string ActorType { get; set; } = "InventoryActor";
+
+ private readonly ILogger _logger;
+
+ public DaprActorsProductInventoryProvider(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public virtual async Task GetInventoryDataAsync(InventoryQueryModel model)
+ {
+ var actor = GetActor(model);
+
+ var stateModel = await actor.GetInventoryStateAsync();
+
+ return new InventoryDataModel
+ {
+ Inventory = stateModel.Inventory,
+ Sold = stateModel.Sold
+ };
+ }
+
+ public virtual async Task> GetSkuIdInventoryDataMappingAsync(
+ IList models)
+ {
+ var result = new Dictionary();
+
+ foreach (var model in models)
+ {
+ result.Add(model.ProductSkuId, await GetInventoryDataAsync(model));
+ }
+
+ return result;
+ }
+
+ public virtual async Task TryIncreaseInventoryAsync(InventoryQueryModel model, int quantity,
+ bool decreaseSold)
+ {
+ var actor = GetActor(model);
+
+ try
+ {
+ await actor.IncreaseInventoryAsync(quantity, decreaseSold);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Actor threw: {Message}", e.Message);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public virtual async Task TryReduceInventoryAsync(InventoryQueryModel model, int quantity, bool increaseSold)
+ {
+ var actor = GetActor(model);
+
+ var stateModel = await actor.GetInventoryStateAsync();
+
+ if (stateModel.Inventory < quantity)
+ {
+ return false;
+ }
+
+ try
+ {
+ await actor.ReduceInventoryAsync(quantity, increaseSold);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Actor threw: {Message}", e.Message);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ protected virtual IInventoryActor GetActor(InventoryQueryModel model)
+ {
+ return ActorProxy.Create(GetActorId(model), ActorType);
+ }
+
+ protected virtual ActorId GetActorId(InventoryQueryModel model)
+ {
+ return new ActorId(
+ $"eshop_inventory_{(model.TenantId.HasValue ? model.TenantId.Value : "host")}_{model.ProductSkuId}");
+ }
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/EShopProductsDaprActorsInventoryDomainModule.cs b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/EShopProductsDaprActorsInventoryDomainModule.cs
new file mode 100644
index 00000000..3c9dc09a
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/EasyAbp/EShop/Products/DaprActorsInventory/EShopProductsDaprActorsInventoryDomainModule.cs
@@ -0,0 +1,28 @@
+using EasyAbp.EShop.Plugins.Inventories.DaprActors;
+using EasyAbp.EShop.Products.Options;
+using Volo.Abp.Modularity;
+
+namespace EasyAbp.EShop.Products.DaprActorsInventory;
+
+[DependsOn(
+ typeof(EShopProductsDomainModule),
+ typeof(EShopPluginsInventoriesDaprActorsAbstractionsModule)
+)]
+public class EShopProductsDaprActorsInventoryDomainModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.InventoryProviders.Configure(
+ DaprActorsProductInventoryProvider.DaprActorsProductInventoryProviderName, provider =>
+ {
+ provider.DisplayName =
+ DaprActorsProductInventoryProvider.DaprActorsProductInventoryProviderDisplayName;
+ provider.Description = DaprActorsProductInventoryProvider
+ .DaprActorsProductInventoryProviderDescription;
+ provider.ProviderType = typeof(DaprActorsProductInventoryProvider);
+ });
+ });
+ }
+}
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xml b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xml
new file mode 100644
index 00000000..1715698c
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xsd b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xsd
new file mode 100644
index 00000000..ffa6fc4b
--- /dev/null
+++ b/plugins/Inventories/DaprActors/src/EasyAbp.EShop.Products.DaprActorsInventory.Domain/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file