using System.Xml.Linq;
using Microsoft.AspNetCore.DataProtection.Repositories;
using Microsoft.Extensions.DependencyInjection;

namespace Dpz.Core.Service;

public class XmlRepositoryService(IServiceScopeFactory factory, string key) : IXmlRepository
{
    private class DpzXmlRepository : IBaseEntity
    {
        public string Id { get; init; } = "";

        public List<string> XmlRepository { get; init; } = new();
    }

    public IReadOnlyCollection<XElement> GetAllElements()
    {
        using var scope = factory.CreateScope();
        var repository = scope.ServiceProvider.GetRequiredService<IRepository<DpzXmlRepository>>();
        var xmlRepository = repository.Collection.Find(x => x.Id == key).FirstOrDefault();
        return (
            xmlRepository?.XmlRepository.Select(XElement.Parse).ToList() ?? new List<XElement>()
        ).AsReadOnly();
    }

    public void StoreElement(XElement element, string friendlyName)
    {
        using var scope = factory.CreateScope();
        var repository = scope.ServiceProvider.GetRequiredService<IRepository<DpzXmlRepository>>();
        var xmlRepository = repository.Collection.Find(x => x.Id == key).FirstOrDefault();
        if (xmlRepository is null)
        {
            repository.Collection.InsertOne(
                new()
                {
                    Id = key,
                    XmlRepository = new() { element.ToString(SaveOptions.DisableFormatting) },
                }
            );
            return;
        }

        var list = xmlRepository.XmlRepository;
        list.Add(element.ToString(SaveOptions.DisableFormatting));
        var update = Builders<DpzXmlRepository>.Update.Set(x => x.XmlRepository, list);
        repository.Collection.UpdateOne(x => x.Id == key, update);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 XmlRepositoryService 的类,它实现了 IXmlRepository 接口,主要用于处理 XML 元素的存储和检索。以下是代码的主要功能和结构的详细解释:

1. 类和构造函数

  • XmlRepositoryService: 这是主要的服务类,负责与 XML 数据的存储和检索进行交互。
  • 构造函数: 接受一个 IServiceScopeFactory 和一个字符串 key。IServiceScopeFactory 用于创建服务范围,以便在需要时获取依赖项。key 用于标识特定的 XML 存储。

2. 内部类

  • DpzXmlRepository: 这是一个内部类,表示 XML 存储的结构。它实现了 IBaseEntity 接口,包含两个属性:
    • Id: 唯一标识符,初始化为空字符串。
    • XmlRepository: 一个字符串列表,用于存储 XML 字符串。

3. 方法

GetAllElements

  • 功能: 从数据库中检索与给定 key 相关的所有 XML 元素。
  • 实现:
    • 创建一个服务范围。
    • 获取 IRepository<DpzXmlRepository> 的实例。
    • 查找与 _key 匹配的 DpzXmlRepository 实例。
    • 如果找到,解析其 XmlRepository 列表中的每个字符串为 XElement,并返回一个只读集合。如果没有找到,则返回一个空的只读集合。

StoreElement

  • 功能: 将一个新的 XML 元素存储到数据库中。
  • 实现:
    • 创建一个服务范围。
    • 获取 IRepository<DpzXmlRepository> 的实例。
    • 查找与 _key 匹配的 DpzXmlRepository 实例。
    • 如果没有找到,创建一个新的 DpzXmlRepository 实例并插入到数据库中,包含新的 XML 元素。
    • 如果找到了,获取现有的 XmlRepository 列表,将新的 XML 元素添加到列表中,并更新数据库中的记录。

4. 数据库操作

  • 代码使用了 MongoDB 的操作(如 InsertOne 和 UpdateOne)来进行数据的插入和更新。
  • SaveOptions.DisableFormatting 用于在将 XElement 转换为字符串时禁用格式化,以便存储更紧凑的 XML 字符串。

总结

XmlRepositoryService 类提供了一个简单的接口来存储和检索 XML 数据,利用 MongoDB 作为后端存储。它允许用户通过唯一的 key 来管理 XML 元素的集合,支持添加新元素和获取所有元素的功能。

评论加载中...