XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.AutoConfig

【DLL】自动实现配置文件的存储

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;

namespace XFEExtension.NetCore.AutoConfig.Tests;

[AutoLoadProfile(false)]
public partial class MigratingJsonProfile : XFEProfile
{
    [ProfileProperty("DisplayName")]
    private string displayName = "default";

    [ProfileProperty]
    private int revision;

    public MigratingJsonProfile() => DefaultProfileOperationMode = ProfileOperationMode.Json;

    protected override int ProfileSchemaVersion => 2;

    protected override void ConfigureMigrations(ProfileMigrationBuilder migrations) => migrations
        .RenameProperty(0, "LegacyName", "DisplayName")
        .Transform(1, static context =>
        {
            var root = JsonNode.Parse(context.Content)?.AsObject() ?? throw new ProfileMigrationException("JSON 根节点无效");
            root["InstanceRevision"] = 7;
            return root.ToJsonString(context.JsonOptions);
        });

    protected override ProfileValidationResult ValidateProfile() => string.IsNullOrWhiteSpace(InstanceDisplayName)
        ? ProfileValidationResult.Failure("DisplayName 不能为空")
        : ProfileValidationResult.Success;
}

[AutoLoadProfile(false)]
public partial class VersionedXfeProfile : XFEProfile
{
    [ProfileProperty]
    private string value = "default";

    protected override int ProfileSchemaVersion => 1;

    protected override void ConfigureMigrations(ProfileMigrationBuilder migrations) => migrations.NoOp(0);
}

[AutoLoadProfile(false)]
public partial class VersionedXmlProfile : XFEProfile
{
    [ProfileProperty]
    private string value = "default";

    public VersionedXmlProfile() => DefaultProfileOperationMode = ProfileOperationMode.Xml;

    protected override int ProfileSchemaVersion => 1;

    protected override void ConfigureMigrations(ProfileMigrationBuilder migrations) => migrations.NoOp(0);
}

public enum ProfileTheme
{
    Light,
    Dark
}

[AutoLoadProfile(false)]
public partial class JsonOptionsProfile : XFEProfile
{
    [ProfileProperty]
    private ProfileTheme theme;

    public JsonOptionsProfile()
    {
        DefaultProfileOperationMode = ProfileOperationMode.Json;
        JsonOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        JsonOptions.WriteIndented = true;
        JsonOptions.AllowTrailingCommas = true;
        JsonOptions.ReadCommentHandling = JsonCommentHandling.Skip;
        JsonOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
    }
}

[AutoLoadProfile(false)]
public partial class TenantProfile : XFEProfile
{
    [ProfileProperty]
    private string name = "default";

    [ProfileProperty]
    private ProfileList<string> values = [];

    public TenantProfile() => DefaultProfileOperationMode = ProfileOperationMode.Json;
}

[AutoLoadProfile(false)]
public partial class AutoBindingProfile : XFEProfile
{
    [ProfileProperty]
    private ProfileList<int> numbers = [];

    [ProfileProperty]
    private ProfileDictionary<int, int> lookup = [];
}