ASP.NET Core 关系映射

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Get新知识:IPropertyMappingServicePropertyMappingService 服务提供类 的提取接口。 public interface IPropertyMappingService { Dictionary<string, PropertyMappingValue> GetPropertyMapping<TSource, TDest...

Get新知识:

IPropertyMappingService
PropertyMappingService 服务提供类 的提取接口。

    public interface IPropertyMappingService
    {
   
        Dictionary<string, PropertyMappingValue> GetPropertyMapping<TSource, TDestination>();
        bool ValidMappingExixtsFor<TSource, TDestination>(string fields);
    }

IPropertyMapping
PropertyMapping 类 的提取接口,便于使用,只需要调用接口,asp.net core会注入一个实例供于使用。

    public interface IPropertyMapping
    {
   
    }

IPropertyCheckService
PropertyCheckService 服务提供类 的提取接口

    public interface IPropertyCheckService
    {
   
        bool TypeHasProperities<T>(string fields);
    }

PropertyMappingValue
提供DTO的字段值的存放,以及排序方式,DestinationProperties 存放DTO类的全部字段值名。

    public class PropertyMappingValue
    {
   
        public IEnumerable<String> DestinationProperties {
    get; set; }
        public bool Revert {
    get; set; }
        public PropertyMappingValue(IEnumerable<string> destinationProperties, bool revert = false)
        {
   
            DestinationProperties = destinationProperties ?? throw new ArgumentNullException(nameof(destinationProperties));
            Revert = revert;
        }
    }

PropertyMapping
用于 实体类的字段 和 DTO类的字段 的映射关系的存放,即 MappingDictionary 属性, string 是实体类的字段值名,PropertyMappingValue 是 DTO类的字段值名。

    public class PropertyMapping<TSource, TDestination> : IPropertyMapping
    {
   
        public Dictionary<string, PropertyMappingValue> MappingDictionary {
    get;private set; }

        public PropertyMapping(Dictionary<string, PropertyMappingValue> mappingDictionary)
        {
   
            MappingDictionary = mappingDictionary ?? throw new ArgumentNullException(nameof(mappingDictionary));
        }

    }

PropertyMappingService
服务提供类,提供 获取属性映射关系的方法

    public class PropertyMappingService : IPropertyMappingService
    {
   
        // 只读字段,映射关系的配置,就是说明需要映射的两个类之间的字段对应关系
        // 这里是 Company 和 CompanyDto 类之间的具体的字段对应关系的配置
        private readonly Dictionary<string, PropertyMappingValue> _companyProperMapping =
            new Dictionary<string, PropertyMappingValue>(StringComparer.OrdinalIgnoreCase)
            {
   
                {
    "Id", new PropertyMappingValue(new List<String>{
    "Id"})},
                {
    "Companyame", new PropertyMappingValue(new List<String>{
    "Name"})},
                {
    "Country", new PropertyMappingValue(new List<String>{
    "Country"})},
                {
    "Industry", new PropertyMappingValue(new List<String>{
    "Industry"})},
                {
    "Product", new PropertyMappingValue(new List<String>{
    "Product"})},
                {
    "Introduction", new PropertyMappingValue(new List<String>{
    "Introduction"})}
            };
        // 这里是 Employee 和 EmployeeDto 类之间的具体的字段对应关系的配置
        private readonly Dictionary<string, PropertyMappingValue> _employeeProperMapping =
            new Dictionary<string, PropertyMappingValue>(StringComparer.OrdinalIgnoreCase)
            {
   
                {
    "Id", new PropertyMappingValue(new List<String>{
    "Id"})},
                {
    "CompanyId", new PropertyMappingValue(new List<String>{
    "CompanyId"})},
                {
    "EmployeeNo", new PropertyMappingValue(new List<String>{
    "EmployeeNo"})},
                {
    "Name", new PropertyMappingValue(new List<String>{
    "First", "LastName"})},
                {
    "GenderDisplay", new PropertyMappingValue(new List<String>{
    "Gender"})},
                {
    "Age", new PropertyMappingValue(new List<String>{
    "DataOfBirth"}, true)}
            };
        // 存放PropertyMapping 的集合
        private readonly IList<IPropertyMapping> _propertyMappings = new List<IPropertyMapping>();
        // 构造函数,
        public PropertyMappingService()
        {
   
            _propertyMappings.Add(new PropertyMapping<EmployeeDTO, Employee>(_employeeProperMapping));
            _propertyMappings.Add(new PropertyMapping<CompanyDTO, Company>(_companyProperMapping));
        }

        public Dictionary<string, PropertyMappingValue> GetPropertyMapping<TSource, TDestination>()
        {
   
            // 从集合等序列中筛选 指定类型的元素,这里是筛选 PropertyMapping 泛型类型的元素
            // 返回存放符合条件元素的集合
            var matchingMapping = _propertyMappings.OfType<PropertyMapping<TSource, TDestination>>();
            if (matchingMapping.Count() == 1)
            {
   
                return matchingMapping.First().MappingDictionary;
            }
            throw new Exception($"无法找到唯一的映射关系{typeof(TSource)}和{typeof(TDestination)}");
        }

        public bool ValidMappingExixtsFor<TSource, TDestination>(string fields)
        {
   
            if (string.IsNullOrWhiteSpace(fields))
            {
   
                return true;
            }
            var propertyMapping = GetPropertyMapping<TSource, TDestination>();
            var fieldAfterSplit = fields.Split(',');
            foreach (var field in fieldAfterSplit)
            {
   
                var trimmedFields = field.Trim();
                var indexOfFirstSpace = trimmedFields.IndexOf(" ");
                var propertyName = indexOfFirstSpace == -1 ? trimmedFields : trimmedFields.Remove(indexOfFirstSpace);
                if (!propertyMapping.ContainsKey(propertyName))
                {
   
                    return false;
                }
            }
            return true;
        }
    }
目录
相关文章
|
10天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
32 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
28天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
38 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
18天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
2月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
33 1
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
前端开发 .NET Linux
|
前端开发 .NET Linux
【翻译】Asp.net Core介绍
ASP.NET Core is a significant redesign of ASP.NET. This topic introduces the new concepts in ASP.NET Core and explains how they help you develop modern web apps. Asp.net Core是重新设计过得新一代Asp.Net。
1189 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
48 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
75 0
下一篇
DataWorks