dotnetcore / osharp

OSharp是一个基于.Net6.0的快速开发框架,框架对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、功能权限、数据权限等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net 框架更易于应用到实际项目开发中。
Apache License 2.0
2.77k stars 748 forks source link

定义新接口IEntityBatchConfiguration,用于接管实体注册时的批量配置 #212

Closed gmf520 closed 3 years ago

gmf520 commented 3 years ago

您的功能请求与现有问题有关吗?请描述

实体注册时,有些实体配置或者实体属性配置的需求比较统一,例如:

描述您想要的解决方案

定义新接口IEntityBatchConfiguration来接管这些配置

    /// <summary>
    /// 定义实体的批量配置功能
    /// </summary>
    [MultipleDependency]
    public interface IEntityBatchConfiguration
    {
        /// <summary>
        /// 配置指定的<see cref="IMutableEntityType"/>
        /// </summary>
        /// <param name="modelBuilder">模型构建器</param>
        /// <param name="mutableEntityType">实体的<see cref="IMutableEntityType"/>类型</param>
        void Configure(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType);
    }

实现示例:表前缀 TableNamePrefixConfiguration

    /// <summary>
    /// 表名前缀配置
    /// </summary>
    public class TableNamePrefixConfiguration : IEntityBatchConfiguration
    {
        /// <summary>
        /// 配置指定的<see cref="IMutableEntityType"/>
        /// </summary>
        /// <param name="modelBuilder">模型构建器</param>
        /// <param name="mutableEntityType">实体的<see cref="IMutableEntityType"/>类型</param>
        public void Configure(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType)
        {
            string prefix = GetTableNamePrefix(mutableEntityType.ClrType);
            if (prefix.IsNullOrEmpty())
            {
                return;
            }

            string tableName = $"{prefix}_{mutableEntityType.GetTableName()}";
            modelBuilder.Entity(mutableEntityType.ClrType).ToTable(tableName);
        }

        /// <summary>
        /// 从实体类型获取表名前缀
        /// </summary>
        /// <param name="entityType">实体类型</param>
        /// <returns></returns>
        protected virtual string GetTableNamePrefix(Type entityType)
        {
            TableNamePrefixAttribute attribute = entityType.GetAttribute<TableNamePrefixAttribute>();
            return attribute?.Prefix;
        }
    }

应用

services.AddSingleton<IEntityBatchConfiguration, TableNamePrefixConfiguration>();