Skip to content

基础脚手架架构思路

约 856 字大约 3 分钟

NET

2024-04-02

思路

遵循清晰的分层架构,开闭原则。每一层都应该有自己的单一职责,并通过接口依赖注入实现松耦合

领域驱动? 业务没那么复杂,领域驱动反而复杂了!领域驱动DDD

  • 入口层
    • 调用核心层的服务对象返回注入
  • 入口.样式层
    • 一些公共的自定义控件、转换器
  • 模块层
    • 各个系统的模块
    • 模块1
    • 模块2
    • ...
  • 核心层
    • 被入口层引用,为系统提供数据及插件支撑
    • 包含服务接口给展示层调用,接口需要数据库访问类库实现
    • 共享模型(DTO)
    • Entity实体
    • 扩展函数,调用各个层比如sqlsugar的注入
  • 核心层.扩展
    • 包含公共的一些扩展函数,工具类
  • 数据层(sqlsugar)
    • 数据访问的相关配置,为核心层做支撑

问题

使用

特性

  • 全局json配置文件自动合并
  • 自动注入接口与实现
  • 数据库种子数据生成

mapster 对象映射

新建类实现IRegister接口即可

public class ExampleMapper : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        //d代表目标对象,s是源对象
        config.ForType<Example, ExampleDto>()
            .Map(d => d.Content, s => s.Content + ",该内容是经过Mapster处理的!")
            .Map(d => d.IsEnableStr, s => s.IsEnable ? "启用中" : "已禁用");
    }
}

在使用Example -> ExampleDto时生效 结果: mapster

也可以手动写

TypeAdapterConfig<TSource, TDestination> 
	.NewConfig() //会覆盖其他的配置 使用ForType() 不会覆盖
	.Ignore(dest => dest.aaa) 
	.Map(dest => dest.FullName, src => string.Format("{0} {1}", src.FirstName, src.LastName));

更多用法参考文档: 高性能对象映射框架 - Mapster

种子数据

Database.json中将库的EnableInitSeed属性设置true即可初始化种子数据

//实现接口ISqlEntitySeedData,带上表实体即可
public class SysUserSeedData : ISqlEntitySeedData<Example>
{
    public IEnumerable<Example> HasData()
    {
	    //写主键 可以根据逐渐更新数据,不加主键的情况下,开启初始化
        return new[] { 
	        new Example { Id = 1, Content = "内容a", Count = 1 },
            new Example { Id = 2, Count = 12 },
            new Example { Id = 3, Count = 13 }, 
        };
    }
}

前端

基础类

  • BaseViewModel:所有viewmodel可继承,或扩展,主要用于申明注入所有页面常用对象或属性

扩展函数

  • 枚举:有个枚举绑定数组的、自动随机生成指定长度枚举数组
  • 使用:
<UserControl ...
xmlns:enumEx="clr-namespace:BasisFrame.WPF.Infrastructure.Enums;assembly=BasisFrame.WPF.Infrastructure"
	.../>
	 <UserControl.Resources>
	     <enum:EnumBindingSource x:Key="OneEnumEnumOptions" EnumType="{x:Type enum:OneEnum}"/>
     </UserControl.Resources>
 <ComboBox DisplayMemberPath="Key" SelectedValuePath="Value" ItemsSource="{Binding Source={StaticResource OneEnumEnumOptions}}" />
</UserControl>
public enum OneEnum
{
    
    [Description("项1")]
    Item1,
    
    [Description("项2")]
    Item2,

    [Description("项3")]
    Item3,
 
}

下拉框