diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.csproj
index d2e57337ab..5df85ab931 100644
--- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.csproj
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo.Abp.FeatureManagement.Domain.csproj
@@ -9,6 +9,7 @@
+
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs
index 1eddabad52..82492b1fd7 100644
--- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs
@@ -1,4 +1,5 @@
using Volo.Abp.FeatureManagement.Localization;
+using Volo.Abp.Features;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
@@ -7,7 +8,8 @@ using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.FeatureManagement
{
[DependsOn(
- typeof(AbpFeatureManagementDomainSharedModule)
+ typeof(AbpFeatureManagementDomainSharedModule),
+ typeof(AbpFeaturesModule)
)]
public class AbpFeatureManagementDomainModule : AbpModule
{
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureStore.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureStore.cs
new file mode 100644
index 0000000000..dbe851008c
--- /dev/null
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureStore.cs
@@ -0,0 +1,27 @@
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Features;
+
+namespace Volo.Abp.FeatureManagement
+{
+ //TODO: Implement caching
+
+ public class FeatureStore : IFeatureStore, ITransientDependency
+ {
+ protected IFeatureValueRepository FeatureValueRepository { get; }
+
+ public FeatureStore(IFeatureValueRepository featureValueRepository)
+ {
+ FeatureValueRepository = featureValueRepository;
+ }
+
+ public async Task GetOrNullAsync(
+ string name,
+ string providerName,
+ string providerKey)
+ {
+ var featureValue = await FeatureValueRepository.FindAsync(name, providerName, providerKey);
+ return featureValue?.Value;
+ }
+ }
+}
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValue.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValue.cs
new file mode 100644
index 0000000000..78f0f97bab
--- /dev/null
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValue.cs
@@ -0,0 +1,42 @@
+using System;
+using JetBrains.Annotations;
+using Volo.Abp.Domain.Entities;
+
+namespace Volo.Abp.FeatureManagement
+{
+ public class FeatureValue : Entity, IAggregateRoot
+ {
+ [NotNull]
+ public virtual string Name { get; protected set; }
+
+ [NotNull]
+ public virtual string Value { get; internal set; }
+
+ [NotNull]
+ public virtual string ProviderName { get; protected set; }
+
+ [CanBeNull]
+ public virtual string ProviderKey { get; protected set; }
+
+ protected FeatureValue()
+ {
+
+ }
+
+ public FeatureValue(
+ Guid id,
+ [NotNull] string name,
+ [NotNull] string value,
+ [NotNull] string providerName,
+ [CanBeNull] string providerKey)
+ {
+ Check.NotNull(name, nameof(name));
+
+ Id = id;
+ Name = Check.NotNullOrWhiteSpace(name, nameof(name));
+ Value = Check.NotNullOrWhiteSpace(value, nameof(value));
+ ProviderName = Check.NotNullOrWhiteSpace(providerName, nameof(providerName));
+ ProviderKey = providerKey;
+ }
+ }
+}
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs
new file mode 100644
index 0000000000..0fd1a644fa
--- /dev/null
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs
@@ -0,0 +1,13 @@
+namespace Volo.Abp.FeatureManagement
+{
+ public static class FeatureValueConsts
+ {
+ public const int MaxNameLength = 128;
+
+ public const int MaxProviderNameLength = 64;
+
+ public const int MaxProviderKeyLength = 64;
+
+ public const int MaxValueLength = 128;
+ }
+}
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs
new file mode 100644
index 0000000000..c630d045a1
--- /dev/null
+++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Volo.Abp.Domain.Repositories;
+
+namespace Volo.Abp.FeatureManagement
+{
+ public interface IFeatureValueRepository : IBasicRepository
+ {
+ Task FindAsync(string name, string providerName, string providerKey);
+
+ Task> GetListAsync(string providerName, string providerKey);
+ }
+}