Я использую бесплатный многостраничный шаблон для ASP.NET Corev4.0.0, который основан на Шаблон ASP.NETv3.8.1. В шаблоне уже реализована AppSettingProvider, в которой вы можете добавить необходимые настройки для приложения или области пользователя, например так on. Проблема в том, что мне нужно использовать очень большое количество настроек, которые имеет смысл сгруппировать. Для этого в классе Настройка Определение есть SettingDefinitionGroupгрупповое свойство. Но как им пользоваться? официальная документация говорит, что это служит только для использования в пользовательском интерфейсе, но не дает пример его использования.
Например, такая структура настроек:
namespace ProjectName.Configuration {
public static class AppSettingNames {
public const string UiTheme = "App.UiTheme";
public static class BaseData {
public static class Company {
public const string Name = "BaseData.Company.Name";
// ...
public static class PostAddress {
public const string Country = "BaseData.Company.PostAddress.Country";
// ...
}
}
public static class UI {
public static class Footer {
public const bool IsVisible = "BaseData.UI.Footer.IsVisible";
// ...
}
public static class Widget {
public static class Weather {
public const bool IsVisible = "BaseData.UI.Widget.IsVisible";
// ...
}
}
}
}
}
}
Как в этом случае указать это в SettingProvider
и использовать группы настроек в UI?
namespace ProjectName.Configuration {
public class AppSettingProvider : SettingProvider {
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context) {
return new[]
{
new SettingDefinition(AppSettingNames.UiTheme,
"red",
scopes: SettingScopes.Application | SettingScopes.Tenant | SettingScopes.User,
isVisibleToClients: true
),
/* BaseData */
new SettingDefinition(AppSettingNames.BaseData.Company.Name,
"default value",
displayName: "setting name",
description: "setting description",
scopes: SettingScopes.Application | SettingScopes.Tenant,
isVisibleToClients: true,
group: ?,
clientVisibilityProvider: new RequiresAuthenticationSettingClientVisibilityProvider()
)
};
}
}
}
🤔 А знаете ли вы, что...
C# обеспечивает возможность создания многопоточных приложений с помощью пространства имен System.Threading.
В настоящее время он не используется, поэтому нужно немного поработать, чтобы его использовать.
Конфигурация:
public class AppSettingProvider : SettingProvider
{
// Hold groups
public static List<SettingDefinitionGroup> Groups = new List<SettingDefinitionGroup>();
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
// Create groups
var group1 = new SettingDefinitionGroup("group1", new LocalizableString("group1_displayName", "sourceName"));
var group2 = new SettingDefinitionGroup("group2", new LocalizableString("group2_displayName", "sourceName"));
// Add groups
Groups.Add(group1);
Groups.Add(group2);
// Configure hierarchy
group1.AddChild(group2);
return new[]
{
new SettingDefinition(AppSettingNames.UiTheme,
"red",
scopes: SettingScopes.Application | SettingScopes.Tenant | SettingScopes.User,
isVisibleToClients: true
),
// Grouped
new SettingDefinition("setting1_name",
"setting1_defaultValue",
group: group1
),
new SettingDefinition("setting2_name",
"setting2_defaultValue",
group: group2
)
};
}
}
Модель пользовательского интерфейса:
public class SettingGroup
{
public List<SettingGroup> Children { get; set; }
public string Name { get; set; }
public List<ISettingValue> Settings { get; set; }
}
Помощники:
private async Task<SettingGroup> GetSettingGroup(string name)
{
var groupList = AppSettingProvider.Groups.Where(g => g.Name == name).ToList();
var settingDefinitions = _settingDefinitionManager.GetAllSettingDefinitions();
var settings = await SettingManager.GetAllSettingValuesAsync();
return GetSettingGroupsRecursively(groupList, settingDefinitions, settings).FirstOrDefault();
}
private List<SettingGroup> GetSettingGroupsRecursively(IReadOnlyList<SettingDefinitionGroup> groups, IReadOnlyList<SettingDefinition> settingDefinitions, IReadOnlyList<ISettingValue> settings)
{
return groups
.Select(group => new SettingGroup
{
Children = GetSettingGroupsRecursively(group.Children, settingDefinitions, settings),
Name = group.Name,
Settings = GetGroupSettings(group, settingDefinitions, settings)
})
.ToList();
}
private List<ISettingValue> GetGroupSettings(SettingDefinitionGroup group, IReadOnlyList<SettingDefinition> settingDefinitions, IReadOnlyList<ISettingValue> settings)
{
return settingDefinitions
.Where(sd => sd.Group?.Name == group?.Name)
.Select(sd => settings.Where(s => s.Name == sd.Name).FirstOrDefault())
.Where(s => s != null)
.ToList();
}
Использование:
var group1SettingGroup = await GetSettingGroup("group1");
var group1Settings = group1SettingGroup.Settings;
// Check hierarchy
// var group2SettingGroup = group1SettingGroup.Children.First();
// var group2Settings = group2SettingGroup.Settings;